现有一个单位内部的小型图书借阅系统,假设每本图书的数量无限制,并且可以借给任何单位成员,每个单位成员可以借多本书,单位成员与图书的关系是多对多的关系。假设系统中仅有三个关系模式。
数据表结构
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 cc identified by ccpassword ;
grant resource, connect, DBA to 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?
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');
初始数据
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 |
|
单表查询
select rname,rage from reader where
select rno from rb
select rname ,raddress from reader where ;
select rname,raddress from reader where ;
注:ORACLE只需一个下划线符号代表一个汉字
select rname,rsex from reader where ;
select bname,bpress,bprice from book;
select bname,bpress,bprice from book where ;
select * from book;
上面的语句用来查看后面的语句结果对不对。
select * from book where ;
SELECT FROM READER
SELECT FROM READER WHERE READER.RNO IN
或:
SELECT FROM RB
select from rb where rno in
select bname,bauthor,bprice from book where
select from book
去掉了空值
SELECT FROM book bpress
复合查询
select reader.rno,rname,rbdate from reader,rb where ;
select reader.rno,rname,rsex,rb.bno,rbdate from reader rb on ;
自身连接:select b.rname from reader a, reader b where ;
子查询:select RNAME from READER WHERE RADDRESS= ;
select reader.rno,rname,rsex,raddress from reader,rb,book where ;
select RNO,RNAME,RSEX,RADDRESS from READER where RNO in ;
问:为什么最后的子句不能是bno=( )?
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
select * from BOOK where BNAME='数据库原理';
select min(BPRICE) from BOOK where BNAME='数据库原理';
select * from BOOK;
上面的语句用来查看后面的语句结果对不对。
select * from book where ;
select READER.RNO,RNAME,RADDRESS from READER;
select * from rb where bno='B001';
上面的语句用来查看后面的语句结果对不对。
select reader.rno,rname,raddress from reader,rb where ;
select rno,rname,raddress from reader where rno ;
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 ; //参考课本P111【例46】
注:前两句SELECT是为了显示原数据表的数据,以检查查询结果是否正确。
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 ; //参考上一题
注:前两句SELECT是为了显示原数据表的数据,以检查查询结果是否正确。
Select union ;
Select minus ;
注意:ORACLE的集合减,不是’except’,而是’ minus’
select rname,2019-rage born
from reader;
select *
from reader
where raddress='416';
select rname,rage
from reader
where rage>=30 and rage<=50;
select DISTINCT rno
from rb;
select rname,raddress
from reader
where rname like '%小%';
select rname,raddress
from reader
where rname like '_小%';
select rname,rsex
from reader
where rname not like '李%';
select bname,bpress,bprice
from book;
select bname,bpress,bprice
from book
where bprice is not null;
select *
from book;
select *
from book
where bpress='清华大学出版社' or bpress='高等教育出版社'
order by bpress desc,bname asc;
select count(*)
from reader;
select count(rno)
from reader
where reader.rno in
(
select distinct rno
from rb
);
select count(distinct rno)
from rb;
select count(*)
from rb
where rno in
(
select rno
from reader
where reader.rname='张三'
);
select bname,bauthor,bprice
from book
where bprice=
(
select max(bprice)
from book
);
select avg(bprice)
from book ;
select bpress,count(*)
from book
group by bpress;
select reader.rno,rname,rbdate
from reader,rb
where reader.rno = rb.rno;
select reader.rno,rname,rsex,rb.bno,rbdate
from reader;
select reader.rno,rname,rsex,rb.bno,rbdate
from reader left outer join rb on (reader.rno=rb.rno);
select b.rname
from reader a, reader b
where a.rname='李小龙' and b.raddress=a.raddress;
select rname
from reader
where raddress=
(
select raddress
from reader
where rname='李小龙'
);
select DISTINCT reader.rno,rname,rsex,raddress
from reader,rb,book
where book.bno=rb.bno and book.bname='数据库原理' 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='数据库原理'
)
);
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 a.rage<=
(
select avg(rage)
from reader b
where b.raddress=a.raddress
);
select *
from BOOK
where BNAME='数据库原理';
select min(BPRICE)
from BOOK
where BNAME='数据库原理';
select *
from BOOK;
select *
from book
where bpress != '清华大学出版社' and bprice <
(
select min(bprice)
from book
where bname='数据库原理'
);
select READER.RNO,RNAME,RADDRESS
from READER;
select *
from rb
where bno='B001';
select reader.rno,rname,raddress
from reader,rb
where reader.rno = rb.rno and rb.bno='B001';
select rno,rname,raddress
from reader
where rno not in
(
select rno
from rb
where bno='B001'
);
select bno
from book;
select reader.rno,rname,rb.bno
from rb left outer join reader on (reader.rno=rb.rno);
select reader.rname
from reader
where rno=
(
select rno
from rb
group by rb.rno
having count(rb.bno)>=
(select count(*)
from book
)
);
select count(bno)
from book;
select rno
from rb
group by rb.rno
having count(rb.bno)>=
(select count(*)
from book
);
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 *
from reader
where rage>30
union
select *
from reader
where raddress='416';
select *
from reader
where rage>30
INTERSECT
select *
from reader
where raddress!='416';