数据库3-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;

  1. 以用户CC的身份建立连接,并在此连接下执行后面的操作;
  2. 拷贝代码运行,删去旧的同名数据表:

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?

  1. 拷贝代码运行,建立表格及输入数据:

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

 

 

单表查询

  1. 查询全体员工的姓名和出生年份;
  2. 查询工作在416房间的员工的所有信息;
  3. 查询年龄在30到50岁之间的员工姓名、年龄;

select rname,rage from reader where             

  1. 查询借了书的员工的编号,排除相同的元素;

select             rno  from rb

  1. 查询名字中包含字“小”的员工姓名、办公地点;

select rname ,raddress from reader where             ;

  1. 查询名字中第二个字为“小”的员工姓名、办公地点;

select rname,raddress from reader where             ;

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

  1. 查询所有不姓“李”的员工姓名、性别;

select rname,rsex from reader where             ;

  1. 查询Book表中价格不为空值的书名、出版社;

select bname,bpress,bprice from book;

select bname,bpress,bprice from book where             ;

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

select * from book;

 

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

 

select * from book  where             ;

  1. 查询员工的总人数

SELECT             FROM READER

  1. 查询借了书的员工的人数;

SELECT             FROM READER WHERE READER.RNO IN             

或:

SELECT             FROM RB

  1. 查询“张三”所借图书的数量;

select            from rb where rno in            

  1. 查询最贵的书籍的作者姓名;

select bname,bauthor,bprice from book where             

  1. 查询Book表中书籍的平均价格,查询结果说明了什么;

select             from book

去掉了空值

  1. 查询book中包含的各个出版社及其出版书籍的数量;

SELECT            FROM book            bpress

 

复合查询

  1. 查询每个员工及其借书情况,列出员工编号、姓名和借书日期

select reader.rno,rname,rbdate from reader,rb where             ;

  1. 查询每个员工及其借书所有字段(没有借书的员工也列出来);(用左外连接)

select reader.rno,rname,rsex,rb.bno,rbdate from reader            rb on            ;

  1. 查询与“李小龙”工作在同一个办公室的员工信息(用两种方法:自身连接、子查询);

自身连接:select b.rname from reader a, reader b where             ;

子查询:select RNAME from READER WHERE RADDRESS=            ;

  1. 查询借阅了“数据库原理”的员工所有信息(两种方法:连接查询、子查询)

select            reader.rno,rname,rsex,raddress from reader,rb,book where            ;

select RNO,RNAME,RSEX,RADDRESS from READER where RNO in             ;

问:为什么最后的子句不能是bno=(            )?

  1. 查询小于或等于同一办公室中成员的平均年龄的员工编号、姓名、年龄。

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             

  1. 查询比所有数据库原理价格都低、并且不是清华大学出版社出版的书籍的信息;

select * from BOOK where BNAME='数据库原理';

select min(BPRICE) from BOOK where BNAME='数据库原理';

select * from BOOK;

 

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

 

select * from book where             ;

  1. 查询借阅了B001的员工的编号、姓名、办公室;

select READER.RNO,RNAME,RADDRESS from READER;

select * from rb where bno='B001';

 

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

 

select reader.rno,rname,raddress from reader,rb where             ;

  1. 查询没有借阅B001的员工的编号、姓名、办公室;

select rno,rname,raddress from reader where rno             ;

  1. 查询借阅了所有书籍的员工的姓名;

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是为了显示原数据表的数据,以检查查询结果是否正确。

  1. 查询至少借阅了编号为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             ; //参考上一题

 

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

  1. 查询年龄大于30岁或者工作在416的员工信息(用集合查询完成)

Select            union            ;

  1. 查询年龄大于30岁并且工作不在416的员工信息(用集合查询完成)

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';



 

你可能感兴趣的:(数据库)