SQL查询数据

一、实验目的
熟练掌握使用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';

六、实验结果及分析
实验结果截图,对实验进行说明和分析。