一、实验目的
熟练掌握使用SQL查询语言。完成各类查询操作(单表查询,连接查询,嵌套查询,集合查询)。
二、实验原理
基于数据库系统概论,熟悉实验环境,熟悉SQL查询数据等本次实验的基本概念,了解SQL查询数据及其相关操作的语法。根据要求,编写相应的SQL代码,并运行、记录和分析结果,测试所编写代码是否满足步骤要求,完成实验。
三、使用仪器、材料
Oracle 11g,windows10;
四、实验步骤
现有一个单位内部的小型图书借阅系统,假设每本图书的数量无限制,并且可以借给任何单位成员,每个单位成员可以借多本书,单位成员与图书的关系是多对多的关系。假设系统中仅有三个关系模式。
数据表结构
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、 创建新的用户并授权:
2、 以用户CC的身份建立连接,并在此连接下执行后面的操作;
3、 拷贝代码运行,删去旧的同名数据表:
4、 拷贝代码运行,建立表格及输入数据:
单表查询
1、 查询全体员工的姓名和出生年份;
2、 查询工作在416房间的员工的所有信息;
3、 查询年龄在30到50岁之间的员工姓名、年龄;
4、 查询借了书的员工的编号,排除相同的元素;
5、 查询名字中包含字“小”的员工姓名、办公地点;
6、 查询名字中第二个字查询所有不姓“李”的员工姓名、性别;
7、 为“小”的员工姓名、办公地点;
8、 查询Book表中价格不为空值的书名、出版社;
9、 查询清华大学出版社和高等教育出版社出版的所有书籍,按照出版社降序、书名升序排列;
10、 查询员工的总人数
11、 查询借了书的员工的人数;
12、 查询“张三”所借图书的数量;
13、 查询最贵的书籍的作者姓名;
14、 查询Book表中书籍的平均价格,查询结果说明了什么;
15、 查询book中包含的各个出版社及其出版书籍的数量;
复合查询
1、 查询每个员工及其借书情况,列出员工编号、姓名和借书日期
2、 查询每个员工及其借书所有字段(没有借书的员工也列出来);(用左外连接)
3、 查询与“李小龙”工作在同一个办公室的员工信息(用两种方法:自身连接、子查询);
4、 查询借阅了“数据库原理”的员工所有信息(两种方法:连接查询、子查询)
5、 查询小于或等于同一办公室中成员的平均年龄的员工编号、姓名、年龄。
6、 查询比所有数据库原理价格都低、并且不是清华大学出版社出版的书籍的信息;
7、 查询借阅了B001的员工的编号、姓名、办公室;
8、 查询没有借阅B001的员工的编号、姓名、办公室;
9、 查询借阅了所有书籍的员工的姓名;
10、 查询至少借阅了编号为R004的员工借阅的全部书籍的员工姓名、性别、办公室
11、 查询年龄大于30岁或者工作在416的员工信息(用集合查询完成)
12、 查询年龄大于30岁并且工作不在416的员工信息(用集合查询完成)
五、实验过程原始记录(实验过程、数据、图表、计算等)
1、
create user cc identified by ccpassword ;
grant resource, connect, DBA to cc;
2、建立连接即可
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;
问:为何要先删去RB?能不能先删去READER?
答:RB中选择了READER的数据作为外码,所以要先删除READER,才允许删除RB。
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');
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');
单表查询
1、
select Rname,2020-Rage as birthyear
from Reader;
2、
select *
from READER
WHERE raddress='416';
3、
SELECT Rname,Rage
from Reader
where Rage>30 AND Rage<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 '_小_';
7、
select Rname ,Rsex
from Reader
where Rname not like '李%';
8、
select Bname,bpress
from book
where bprice is not null;
9、
select *
from Book
where bpress='清华大学出版社'or bpress='高等教育出版社'
order by bpress desc,bname asc;
10、
select count(*)
from Reader;
11、
select count(distinct RNO)
from Rb;
12、
select count(*)
from rb
where rno in(
select rno
from reader
where Rname='张三'
);
13、
select bname,bauthor,bprice
from book
where(
bprice=(select max(bprice)
from book)
);
14、
select AVG(bprice)
from book;
15、
select bpress,count(bpress)
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 (reader.rno=rb.rno);
3、
自身连接:
select b.rname from reader a,reader b
where b.raddress=a.raddress and a.rname='李小龙' and b.rname<>'李小龙';
子查询:
select rname from reader
where raddress=(select raddress from reader where rname='李小龙') and rname<>'李小龙';
4、
问:为什么最后的子句不能是bno=( )?
答:reader表中没有bno这个属性
连接查询:
select distinct (reader.rno),rname,rsex,raddress,rage,rboss
from reader,rb,book
where book.bno=rb.bno and rb.rno=reader.rno and book.bname='数据库原理';
子查询:
select RNO,RNAME,RSEX,RADDRESS, rage ,rboss
from READER
where RNO in (
select RNO
from rb,book
where bname='数据库原理' and book.bno=rb.bno
);
5、
select a.rno,a.rname,a.rage,a.raddress
from reader a
where a.rage<=(
SELECT avg(rage)
from reader b
where a.raddress=b.raddress
);
6、
select *
from book
where bprice<(
select min(bprice)
from book
where bname='数据库原理'
)and bpress<>'清华大学出版社';
7、
select reader.rno,rname,raddress
from reader,rb
where reader.rno=rb.rno and bno='B001';
8、
select rno,rname,raddress
from reader
where rno not in(
select rno
from rb
where bno='B001'
);
9、
select RNAME from READER
where not exists (
select * from book
where not exists(
select *from rb
where bno=book.bno and rno=reader.rno
)
);;
10、
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
)
);
11、
select *
from reader
where rage>30
union
select *
from reader
where raddress='416';
12、
select *
from reader
where rage>30
minus
select *
from reader
where raddress='416';
六、实验结果及分析
实验结果截图,对实验进行说明和分析。
本处由于实验中所需截图过多,不进行一一上传,有需要实验结果截图或者其他实验报告的同学可以点击https://download.csdn.net/download/weixin_43981315/12721378获取!