实验一 SQL语言

实验一 SQL语言

  1. 数据库的创建与删除
    实验目的
    (1)掌握利用Oracle Database Configuration Assistant工具来创建和删除Oracle数据库,掌握Oracle中的用Create命令定义表的方法,以及表的完整性定义,并掌握Oracle中的用Alter命令 和Drop命令对表的修改和删除。
    实验内容
  2. 用Oracle Database Configuration Assistant创建数据库
    开始->所有程序->Oracle-……->配置和移植工具->Database Configuration Assistant(记住创建数据库时使用的用户名和密码)
  3. 打开SQLDEVELOPER,用上一步设置的用户名和密码建立连接。

注:也可以不用密码,用管理员身份登录到本地Oracle数据库,可以采用“操作系统验证”,连接类型选择“本地/继承”,角色选择SYSDBA。Oracle管理员SYS、SYSTEM的密码为oracle,若密码有误,启动CMD进入命令提示符,执行命令:
a) SQLPLUS / as SYSDBA
b) Alter user SYSTEM identified by 新密码;(新密码自行设置)
c) Conn SYSTEM/新密码; –用SYSTEM用户登录,同样可以修改SYS的密码

  1. 创建以下数据表(Student(主码为SNO)、Course(主码为CNO)、SC(主码为(SNO、CNO)),其中SNO引用Student的SNO属性,CNO引用Course的CNO属性)
  2. 向三个表格中插入3条数据,数据内容自编。
  3. 修改Student表格,用SQL语句为Student表格添加一个“入学时间”属性,属性名为Senrollment。
  4. 限定Ssex的值只能为“男”或者“女”。
  5. 修改Course表格,用SQL语句为Course表格添加一个“说明”属性,属性名为“Cdesc”,类型为varchar2,长度为200。
  6. 更改Course表格的Cdesc属性,使其长度变为500。
  7. 删除刚建立的属性Cdesc。
  8. 修改Course表的CPNO,使其为外码,引用Course表的CNO属性。
    Student表
    属性名 类型 长度 是否空 含义
    SNO varchar2 17 主码(非空) 学生编号
    Sname varchar2 10 否 姓名
    Sage integer 年龄
    Ssex varchar2 2 性别
    Sdept varchar2 20 所在系
    Course表
    属性名 类型 长度 是否空 含义
    CNO varchar2 5 主码(非空) 课程编号
    Cname varchar2 20 否 课程名
    CPNO varchar2 5 先修课程
    Ccredit integer 学分
    SC表
    属性名 类型 长度 是否空 含义
    SNO varchar2 17 主属性(非空) 学生编号
    CNO varchar2 5 主属性(非空) 课程编号
    Grade numeric 5,2 成绩

注意保存好相应的脚本文件,以便下次单独运行
实验报告要求
按照指导书中的实验内容顺序完成实验,回答提出的问题,补全相关的SQL语句。对于纯文字不好描述的内容,可通过实验截图辅助说明。建议问题回答部分和SQL语句部分用红色字体突出显示。
部分提示(黄色底的代码可以直接粘贴运行):
如果以SYSDBA的身份连接到数据库,则看到大量的系统数据表:

为方便查看自己创建的数据表,可以创建新的用户,以新用户的身份连接:
create user cc identified by ccpassword ;
grant resource, connect to cc;
注解:新的用户名是cc,密码是ccpassword,授予两种角色(ORACLE预定义的角色)的权限。
执行结果:
在“其他用户”栏目中可以看到:
以这个新的用户建立新的连接:连接名任意(和上一个不重复即可),用户名和密码要和刚才创建的一致。

连接成功之后,执行:
CREATE TABLE Student
(Sno varchar2(17) primary key,
Sname varchar2(10) not null UNIQUE,
Sage INT,
Ssex char(2) CHECK(Ssex IN (‘男’,‘女’) ),
Sdept varchar2(20));

在此连接里,只看到用户自己创建的表:

执行下面的语句修改表结构:
ALTER TABLE Student ADD Scome DATE;
看到表的结构如下:

查ORACLE帮助:
default Oracle date format is “DD-MMM-YY”.
为了看实际的日期格式,执行语句:
SELECT SYSDATE from dual;
得到以下运行结果:

26-4月 -12
执行以下语句插入数据:
INSERT INTO Student VALUES (‘201000610002’,‘罗嘉铭’,18,‘男’,‘网络工程’,‘01-9月-2010’);
INSERT INTO Student VALUES (‘201000610003’,‘叶茵’,17,‘女’,‘软件工程’,‘01-9月-2010’);
INSERT INTO Student VALUES (‘201000610004’,‘陈凯怡’,19,‘女’,‘网络工程’,‘01-9月-2010’);
INSERT INTO Student VALUES (‘201000610001’,‘潘阳阳’,20,‘男’,‘计算机科学’,‘01-9月-2010’);
INSERT INTO Student VALUES (‘201000610005’,‘林祥宇’,19,‘男’,‘软件工程’,‘01-9月-2010’);

可以看到以下的结果:

尝试一下用可视化界面输入数据?

在性别一栏填入其他字:

  1. 数据查询
    实验目的
    熟练掌握使用SQL查询语言。完成各类查询操作(单表查询,连接查询,嵌套查询,集合查询)。

实验内容
现有一个单位内部的小型图书借阅系统,假设每本图书的数量无限制,并且可以借给任何单位成员,每个单位成员可以借多本书,单位成员与图书的关系是多对多的关系。假设系统中仅有三个关系模式。
数据表结构
Reader表
属性名 类型 长度 是否空 含义
RNO varchar2 4 员工编号(主码)
Rname varchar2 10 否 员工姓名
Rsex varchar2 2 性别
Rage integer integer 年龄
Rboss varchar2 10 直接上司
Raddress varchar2 30 办公地点
Book表
属性名 类型 长度 是否空 含义
BNO varchar2 4 书本编号(主码)
Bname varchar2 50 否 书名
Bauthor varchar2 50 作者
Bpress varchar2 50 出版社
Bprice varchar2 numeric(6,2) 价格
RB表
属性名 类型 长度 是否空 含义
RNO varchar2 4 员工编号
BNO varchar2 4 书本编号
RBdate date 借阅日期

提示(黄色底的代码可以直接粘贴运行):
1、 创建新的用户并授权:
create user cc identified by ccpassword ;
grant resource, connect, DBA to cc;
2、 以用户CC的身份建立连接,并在此连接下执行后面的操作;
3、 拷贝代码运行,删去旧的同名数据表:
Declare
tmp integer default 0;
Begin
select count() into tmp from user_tables where table_name=‘RB’;
if(tmp>0) then
execute immediate ‘drop table RB’;
end if;
select count(
) into tmp from user_tables where table_name=‘READER’;
if(tmp>0) then
execute immediate ‘drop table READER’;
end if;
select count(*) into tmp from user_tables where table_name=‘BOOK’;
if(tmp>0) then
execute immediate ‘drop table BOOK’;
end if;
end;

问:为何要先删去RB?能不能先删去READER?
因为RB表中已经定义了外键RNO(关联了Reader)和BNO(关联了Book),如果先删去READER就违反了参照完整性。
4、 拷贝代码运行,建立表格及输入数据:
create table Reader
(
RNO varchar2(4) primary key,
Rname varchar2(10) not null,
Rsex varchar2(2),
Rage integer,
Rboss varchar2(10),
Raddress varchar2(30)
) ;
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R001’,‘张三’,20,‘男’,‘李四’,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R002’,‘张三’,35,‘女’,null,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R003’,‘李四’,30,‘男’,null,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R004’,‘王五’,20,‘男’,null,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R005’,‘马六’,40,‘男’,null,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R006’,‘刘三’,20,‘男’,null,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R007’,‘王四’,40,‘男’,‘李四’,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R008’,‘李小龙’,20,‘男’,‘李四’,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R009’,‘王小倩’,40,‘男’,‘李四’,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R010’,‘王一小’,20,‘男’,‘李四’,‘417’);

Commit;

create table Book
(
BNO varchar2(4),
Bname varchar2(50) not null,

Bauthor	varchar2(50),
Bpress	varchar2(50),
Bprice	numeric(6,2), 
primary key(BNO)

);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values(‘B001’,‘严蔚敏’,‘数据结构’,‘清华大学出版社’,null);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values(‘B002’,‘唐发根’,‘数据结构’,‘北航出版社’,24);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values(‘B003’,‘王珊’,‘数据库原理’,‘高等教育出版社’,40);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values(‘B004’,‘张飞’,‘数据库原理’,‘清华大学出版社’,30);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values(‘B005’,‘王珊’,‘数据库原理’,‘清华大学出版社’,null);

create table RB
(
RNO varchar2(4),
BNO varchar2(4),
RBdate date default sysdate,
primary key(RNO,BNO),
foreign key (RNO) references Reader(RNO),
foreign key (BNO) references Book(BNO)
);
insert into RB (RNO,BNO) values (‘R001’,‘B001’);
insert into RB (RNO,BNO) values (‘R001’,‘B002’);
insert into RB (RNO,BNO) values (‘R001’,‘B004’);
insert into RB (RNO,BNO) values (‘R002’,‘B001’);
insert into RB (RNO,BNO) values (‘R003’,‘B001’);
insert into RB (RNO,BNO) values (‘R004’,‘B001’);
insert into RB (RNO,BNO) values (‘R004’,‘B002’);
insert into RB (RNO,BNO) values (‘R005’,‘B001’);
insert into RB (RNO,BNO) values (‘R006’,‘B001’);
insert into RB (RNO,BNO) values (‘R006’,‘B003’);
insert into RB (RNO,BNO) values (‘R006’,‘B005’);
insert into RB (RNO,BNO) values (‘R006’,‘B002’);
insert into RB (RNO,BNO) values (‘R006’,‘B004’);

初始数据
reader表
RNO RNAME RSEX RAGE RBOSS RADDRESS
R001 张三 男 20 李四 416
R002 张三 女 35 417
R003 李四 男 30 416
R004 王五 男 20 417
R005 马六 男 40 416
R006 刘三 男 20 417
R007 王四 男 40 李四 416
R008 李小龙 男 20 李四 417
R009 王小倩 男 40 李四 416
R010 王一小 男 20 李四 417

book表中数据
BNO BNAME BAUTHOR BPRESS BPRICE
B002 数据结构 唐发根 北航出版社 24
B003 数据库原理 王珊 高等教育出版社 40
B004 数据库原理 张飞 清华大学出版社 30
B005 数据库原理 王珊 清华大学出版社
B001 数据结构 严蔚敏 清华大学出版社

RB表中数据
RNO BNO RBDATE(实验时间)
R001 B001 插入数据时的系统时间
R001 B002
R001 B004
R002 B001
R003 B001
R004 B001
R004 B002
R005 B001
R006 B001
R006 B003
R006 B005
R006 B002
R006 B004

单表查询
1、 查询全体员工的姓名和出生年份;
SELECT RNAME,2020-RAGE FROM READER;

2、 查询工作在416房间的员工的所有信息;
SELECT * FROM READER WHERE RADDRESS=416;

3、 查询年龄在30到50岁之间的员工姓名、年龄;
select rname,rage from reader where RAGE BETWEEN 30 AND 50;

4、 查询借了书的员工的编号,排除相同的元素;
select DISTINCT rno from rb ;

5、 查询名字中包含字“小”的员工姓名、办公地点;
select rname ,raddress from reader WHERE RNAME LIKE ‘%小%’;

6、 查询名字中第二个字为“小”的员工姓名、办公地点;
select rname,raddress from reader where RNAME LIKE ‘_小%’ ;

注:ORACLE只需一个下划线符号代表一个汉字

7、 查询所有不姓“李”的员工姓名、性别;
select rname,rsex from reader where RNAME NOT LIKE ‘%小%’ ;
8、 查询Book表中价格不为空值的书名、出版社;
select bname,bpress,bprice from book;
select bname,bpress,bprice from book where BPRICE IS NOT NULL ;

9、 查询清华大学出版社和高等教育出版社出版的所有书籍,按照出版社降序、书名升序排列;
select * from book;

上面的语句用来查看后面的语句结果对不对。

select * from book WHERE BPRESS=‘清华大学出版社’ OR bpress=‘高等教育出版社’;

10、 查询员工的总人数
SELECT COUNT(RNAME) FROM READER;

11、 查询借了书的员工的人数;
SELECT COUNT(DISTINCT RNO) FROM READER WHERE READER.RNO IN SELECT RNO FROM RB ; ;
或:
SELECT COUNT(DISTINCT RNO) FROM RB;

12、 查询“张三”所借图书的数量;
select COUNT(DISTINCT BNO) from rb where rno in (
SELECT RNO FROM READER WHERE RNAME=‘张三’);

13、 查询最贵的书籍的作者姓名;
select bname,bauthor,bprice from book where bprice IN(
SELECT MAX(BPRICE)
from book);

14、 查询Book表中书籍的平均价格,查询结果说明了什么;
select AVG(BPRICE) from book
去掉了空值

15、 查询book中包含的各个出版社及其出版书籍的数量;
SELECT BPRESS,COUNT(BNAME) FROM book GROUP BY bpress;

复合查询
1、 查询每个员工及其借书情况,列出员工编号、姓名和借书日期
select reader.rno,rname,rbdate from reader,rb where READER.RNO=RB.RNO ;

2、 查询每个员工及其借书所有字段(没有借书的员工也列出来);(用左外连接)
select reader.rno,rname,rsex,rb.bno,rbdate from reader LEFT OUTER JOIN rb on (
RB.RNO=READER.RNO) ;

3、 查询与“李小龙”工作在同一个办公室的员工信息(用两种方法:自身连接、子查询);
自身连接:select b.rname from reader a, reader b where A.RNAME=‘李小龙’ AND A.RADDRESS=B.RADDRESS AND B.RNAME!=‘李小龙’;
子查询:select RNAME from READER WHERE RADDRESS= (
SELECT RADDRESS
FROM READER
WHERE RNAME=‘李小龙’ ) AND RNAME!=‘李小龙’;

4、 查询借阅了“数据库原理”的员工所有信息(两种方法:连接查询、子查询)
Select RBOSS,RAGE,READER.RNO,RNAME,RSEX,RADDRESS FROM reader.rno,rname,rsex,raddress from reader,rb,book where BNAME=‘数据库原理’ AND rb.BNO=book.bno AND RB.RNO=READER.RNO;
select RNO,RNAME,RSEX,RADDRESS from READER where RNO in (
SELECT RNO FROM RB WHERE BNO IN( SELECT BNO FROM BOOK WHERE BNAME=‘数据库原理’));
问:为什么最后的子句不能是bno=( )?
表READER中没有BNO属性列
5、 查询小于或等于同一办公室中成员的平均年龄的员工编号、姓名、年龄。
select RNO,RNAME,RAGE,RADDRESS from READER order by raddress;

select raddress,avg(rage) from reader group by raddress ;

上面的两句用来查看后面的语句结果对不对。

select a.rno,a.rname,a.rage,a.raddress from reader a where RAGE<=(
SELECT AVG(B.RAGE)
FROM READER B
WHERE A.RADDRESS=B.RADDRESS
);

6、 查询比所有数据库原理价格都低、并且不是清华大学出版社出版的书籍的信息;
select * from BOOK where BNAME=‘数据库原理’;
select min(BPRICE) from BOOK where BNAME=‘数据库原理’;
select * from BOOK;

上面的语句用来查看后面的语句结果对不对。

select * from book where BPRICE<ANY(
SELECT BPRICE
FROM BOOK
WHERE BNAME=‘数据库原理’
)
AND BPRESS!=‘清华大学出版社’;

7、 查询借阅了B001的员工的编号、姓名、办公室;
select READER.RNO,RNAME,RADDRESS from READER;
select * from rb where bno=‘B001’;

上面的语句用来查看后面的语句结果对不对。

select reader.rno,rname,raddress from reader,rb where RB.BNO=‘B001’ AND RB.RNO=READER.RNO;

8、 查询没有借阅B001的员工的编号、姓名、办公室;
select rno,rname,raddress from reader where rno SELECT RNO
FROM RB
WHERE BNO=‘B001’
AND READER.RNO=RB.RNO);

9、 查询借阅了所有书籍的员工的姓名;
select bno from book;
select reader.rno,rname,rb.bno from rb left outer join reader on (reader.rno=rb.rno);

上面的语句用来查看后面的语句结果对不对。

select RNAME from READER
where NOT EXISTS(
SELECT *
FROM BOOK
WHERE NOT EXISTS(
SELECT *
FROM RB
WHERE BNO=BOOK.BNO
AND RNO=READER.RNO)); //参考课本P108【例3.62】

注:前两句SELECT是为了显示原数据表的数据,以检查查询结果是否正确。

10、 查询至少借阅了编号为R004的员工借阅的全部书籍的员工姓名、性别、办公室
Select * From Rb Where Rno=‘R004’;
select reader.rno,rname,rb.bno from rb left outer join reader on (reader.rno=rb.rno);

上面的语句用来查看后面的语句结果对不对。

Select Rname,Rsex,raddress From Reader
Where NOT EXISTS(
SELECT *
FROM RB A
WHERE A.RNO=‘R004’ AND NOT EXISTS(
SELECT *
FROM RB B
WHERE B.RNO=READER.RNO AND A.BNO=B.BNO)); //参考上一题
注:前两句SELECT是为了显示原数据表的数据,以检查查询结果是否正确。

11、 查询年龄大于30岁或者工作在416的员工信息(用集合查询完成)
Select *
FROM READER
WHERE RAGE>30
union
SELECT *
FROM READER
WHERE RADDRESS=‘416’;

12、 查询年龄大于30岁并且工作不在416的员工信息(用集合查询完成)
Select *
FROM READER
WHERE rage>30
minus
SELECT*
FROM READER
WHERE raddress=‘416’;
注意:ORACLE的集合减,不是’except’,而是’ minus’

实验报告要求
按照指导书中的实验内容顺序完成实验,回答提出的问题,补全相关的SQL语句。对于纯文字不好描述的内容,可通过实验截图辅助说明。建议问题回答部分和SQL语句部分用红色字体突出显示。
3. 数据更新
实验目的
熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录。
创建索引,删除索引。
创建视图,使用视图,删除视图。

实验内容
仍然基于上次课程建立的小型图书借阅系统。如果使用实验室的机器完成实验,首先重做上次课的步骤1-4建立相应数据库。
以用户CC的身份建立连接,并在此连接下执行后面的操作。
1、 查询记录:在Reader表中查询直接上司是“李四”的员工的名字
SELECT RNAME
FROM READER
WHERE RBOSS=‘李四’;

2、 修改记录:在Reader表中把直接上司是“李四”的员工的办公地点统一改为“420”
UPDATE READER
SET RADDRESS=‘420’
WHERE RBOSS=‘李四’;

3、 删除记录:在Reader表中把直接上司未赋值(NULL)是记录删去
DELETE FROM reader WHERE rboss IS NULL;
4、 删去数据表:把整个Reader表删去
drop table reader cascade CONSTRAINTS;
5、 重新执行第一、二步,即建立数据表、插入数据。
create table Reader
(
RNO varchar2(4) primary key,
Rname varchar2(10) not null,
Rsex varchar2(2),
Rage integer,
Rboss varchar2(10),
Raddress varchar2(30)
) ;
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R001’,‘张三’,20,‘男’,‘李四’,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R002’,‘张三’,35,‘女’,null,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R003’,‘李四’,30,‘男’,null,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R004’,‘王五’,20,‘男’,null,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R005’,‘马六’,40,‘男’,null,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R006’,‘刘三’,20,‘男’,null,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R007’,‘王四’,40,‘男’,‘李四’,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R008’,‘李小龙’,20,‘男’,‘李四’,‘417’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R009’,‘王小倩’,40,‘男’,‘李四’,‘416’);
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values(‘R010’,‘王一小’,20,‘男’,‘李四’,‘417’);
Commit;
6、 创建表格Reader2,比较Reader2和Reader中的记录和结构是否相同
create table reader2 as select * from reader; –创建表格reader2

查看这两个数据表的结构、内容是否相同?分别执行:
desc reader;

desc reader2;

也可以在可视化界面查看这两个表所附带的约束

7、 分别执行下面的每行语句,查看语句是否执行成功,分析为什么?
update reader set RNO=‘R001’ where Rname=‘张三’;

因为在reader表里面,主键是RNO,当在更新RNO的时候,表中主键的属性列已经存在相同的数据了,那么主键的数据就没有遵循唯一性,所以会报错,而使用了create table reader2 as select * from reader;创建的reader2是不会复制reader的约束的,所以reader2是没有设置默认值的。
update reader2 set RNO=‘R001’ where Rname=‘张三’;

insert into reader2(RNO,Rname,Rsex,Rage,Rboss, Raddress) values(null,‘lisi’,null,null,null,null);

8、 删除Reader2表格;

以下为查询READER表中创建的约束类型,其中constraint_type为约束类型,该属性值的取值Type Code如下表所示。(可以根据上课所讲的实体完整性、参照完整性、用户自定义完整性理解以下约束类型;直接在SQL DEVELOPER中双击表格也可以查看在表上所建立的约束)
select table_name,constraint_name,constraint_type from user_constraints where table_name =‘READER’;

Type Code Type Description Acts On Level
C Check on a table Column
O Read Only on a view Object
P Primary Key Object
R Referential AKA Foreign Key Column
U Unique Key Column
V Check Option on a view Object

1、 执行insert into RB(RNO,BNO) values(‘R010’,‘B005’);

2、 写出删除Reader表格中编号为’R010’的员工,如果执行错误,分析错误原因。

3、 想办法删除Reader中的’R010’员工;
方法一:先把RB中所有’R010’的借书记录都删掉
方法二:修改数据表READER的结构,允许级联删除(注:ORACLE不支持级联更新)。
alter table rb add constraint MYFK foreign key(rno) references reader(rno) on delete cascade;
系统提示:SQL 错误: ORA-02275: 此表中已经存在这样的引用约束条件

可见,首先要先删去原来的约束,因建表时没给该约束命名,故应查这个约束的名字,才能删去。注意,这个名字由系统自动赋值,不同的环境下约束名可能不同):

alter table rb drop constraint sys_c005544;
alter table rb add constraint MYFK foreign key(rno) references reader(rno) on delete cascade;

再执行:delete from reader where rno=‘R010’;
顺利删去一行,打开RB表,发现前面插入的(‘R010’,‘B005’)也不在了。
4、 为Reader表添加一个属性列“出生年份”,名为Rbirthday,整数;
alter table reader add(RBIRTHDAY INTEGER) ;

5、 对于Reader表格,员工编号可以确定年龄,年龄又可以确定出生年份,因此存在传递函数依赖关系,删除Rbirthday列,使关系模式符合第三范式要求;
alter table reader DROP(RBIRTHDAY);

6、 修改Reader表格的Raddress属性,使其长度为50,数据类型不变;
alter table reader modify(RADDRESS VARCHAR2(50));
7、 修改book表的Bprice属性,使其值得范围在10到100之间;
alter table book add constraint bp check (BPRICE BETWEEN 10 AND 100);
8、 修改Reader表的Rage属性,使其值得范围为16到60之间。
ALTER TABLE READER ADD CONSTRAINT RA CHECK(RAGE BETWEEN 10 AND 100);
9、 试试是否可以删除Reader表,使用CASCADE是否可以删除?
drop table reader CASCADE;

10、 删除Reader、Book和RB表。
DROP TABLE READER CASCADE CONSTRAINTS;
DROP TABLE book CASCADE CONSTRAINTS;
DROP TABLE RB CASCADE CONSTRAINTS;
索引的建立与删除
1、 重新执行前面的代码创建三个数据表并插入数据;
2、 为Reader表格的Rname建立UNIQUE索引
create unique index myindex on reader(rname);
报告出错:“cannot CREATE UNIQUE INDEX; duplicate keys found”
如何修改表格数据,再建索引?
删除RNAME中重复的值,再建立索引就不会报错了
3、 删除索引。
Drop INDEX MYINDEX;
视图
1、 如果上面的运行是在CC的连接中,则需要回到在sysdba 的连接中,执行:
grant resource, connect, DBA to cc;
否则系统显示没有创建视图的权限。执行完之后再回到CC的连接:
在ORACLE SQL Developer 的左上方:
2、 建立在416办公室工作的视图V416,视图包括员工的编号、姓名、年龄等信息
CREATE VIEW V416 as select rno,rname,rage from reader where raddress=‘416’
确认该视图的存在:
select * from v416

3、 从V416中查询年龄大于30的员工信息

4、 向视图V416中插入一条新的员工记录,然后从V416中查找该条记录,测试是否可以找到;
insert into v416( rno,rname,rage) values(‘R999’,‘new reader’,99);
select * from reader
select * from v416

插入成功了吗?为什么通过视图插入的纪录在视图中看不见?
插入成功,插入的数据不满足视图的构成条件,插入的数据中的RADDRESS IS NULL 而视图的构成条件是RADRESS=’416’
5、 建立在417办公室工作的视图V417,视图包括员工的编号、姓名、性别、年龄等信息,视图定义带with check option选项;
CREATE VIEW V417 as select rno,rname,rsex,rage,raddress from reader where raddress=‘417’ with check option;
select * from v417

6、 向视图V417中插入一条新的员工记录,然后从V417中查找该条记录,测试是否可以找到;
insert into v417( rno,rname,rage) values(‘R777’,‘417 reader’,66);

执行不成功。
drop view v417;

CREATE VIEW V417 as select rno,rname,rsex,rage,raddress from reader where raddress=‘417’ with check option;
insert into v417( rno,rname,rage,raddress) values(‘R777’,‘417 reader’,66,‘417’);
执行成功。

7、 通过视图删除刚插入的员工记录,在基本表Reader中查看是否已经删除成功?
select * from v416;
delete from v416 where rname=‘王小倩’;
select * from v416;

8、 在视图V417上建立所有女员工信息的视图FV417,查询视图结果
CREATE VIEW FV417 as select * from V417 where RSEX=‘女’;
select * from FV417;

9、 删除视图V417中没有借阅图书的员工信息
SELECT * FROM V417;
Delete from v417 where v417.rno not in (SELECT rno from rb);
SELECT * FROM V417;

10、 建立视图GV,数据包括每本图书的编号及其借阅数量。思考是否可以向GV中插入数据,为什么?
SELECT BNO,COUNT(*) FROM RB GROUP BY BNO;

CREATE VIEW GV(BNO,COUNTS) AS SELECT BNO,COUNT(*) FROM RB GROUP BY BNO;
SELECT * FROM GV;

11、 删除视图V417
drop view v417

实验报告要求
按照指导书中的实验内容顺序完成实验,回答提出的问题,补全相关的SQL语句。对于纯文字不好描述的内容,可通过实验截图辅助说明。建议问题回答部分和SQL语句部分用红色字体突出显示。


版权声明:本文为weixin_43697280原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。