实验目的
熟练掌握使用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 | 借阅日期 |
- 创建新的用户并授权:
create user c##cc identified by ccpassword ;
grant resource, connect, DBA to c##cc;
-
以用户CC的身份建立连接,并在此连接下执行后面的操作;
截图如下:
-
拷贝代码运行,删去旧的同名数据表:
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
就会违反了参照完整性。
- 拷贝代码运行,建立表格及输入数据:
create table Reader
(
RNO varchar2(4) primary key,
Rname varchar2(10) not null,
Rsex varchar2(3),
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