实验目的

熟练掌握使用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 c##cc identified by ccpassword ;
grant resource, connect, DBA  to c##cc;

  1. 以用户CC的身份建立连接,并在此连接下执行后面的操作;
    截图如下:

  2. 拷贝代码运行,删去旧的同名数据表:

DECLAREtmp INTEGER DEFAULT 0;
BEGINSELECTCOUNT(*)INTO tmpFROMuser_tablesWHEREtable_name = 'RB';IF ( tmp > 0 ) THENEXECUTE IMMEDIATE 'drop table RB';END IF;SELECTCOUNT(*)INTO tmpFROMuser_tablesWHEREtable_name = 'READER';IF ( tmp > 0 ) THENEXECUTE IMMEDIATE 'drop table READER';END IF;SELECTCOUNT(*)INTO tmpFROMuser_tablesWHEREtable_name = 'BOOK';IF ( tmp > 0 ) THENEXECUTE IMMEDIATE 'drop table BOOK';END IF;
END;

问:为何要先删去RB?能不能先删去READER

答:因为RB表中定义了外码RNO(被参照表Reader)和BNO(被参照表Book),如果先删去READER就会违反了参照完整性。

  1. 拷贝代码运行,建立表格及输入数据:
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 (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 NAME, 2020-Rage BIRTHDAY FROM READER;

2、 查询工作在416房间的员工的所有信息;

SELECT * FROM READER WHERE raddress='416';

3、 查询年龄在30到50岁之间的员工姓名、年龄;

SELECT Rname,Rage FROM reader WHERE Rage BETWEEN 30 AND 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、 查询Book表中价格不为空值的书名、出版社;

SELECT Bname, Bpress,Bprice FROM Book WHERE bprice IS NOT NULL;


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

SELECT * FROM book;

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

SELECT * FROM book WHERE BPRESS IN ('清华大学出版社','高等教育出版社')ORDER BY bpress DESC, BNAME ASC;


10、 查询员工的总人数

SELECT COUNT(*)  FROM READER


11、 查询借了书的员工的人数;

SELECT COUNT(DISTINCT READER.RNO) FROM READER,RB WHERE READER.RNO IN RB.RNO;

或:

SELECT COUNT(DISTINCT RNO) FROM RB;

12、 查询“张三”所借图书的数量;

SELECT COUNT(*) FROM RB WHERE Rno in ('R001', 'R002');

13、 查询最贵的书籍的作者姓名;

SELECT bname,bauthor,bpriceFROM BOOK
WHERE bprice IN (SELECT MAX(bprice) FROM book);


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

select AVG(bprice) from book;

查询结果:去掉了空值

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

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,rb.rbdateFROM reader LEFT OUTER JOIN rb ON reader.rno=rb.Rno;

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

自身连接:

SELECT b.rnameFROM reader a, reader bWHERE b.raddress=a.raddress and a.rname='李小龙';


子查询:

SELECT RNAME FROM READER WHERE RADDRESS =(select raddress from reader where reader.rname='李小龙');


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

连接查询:

select UNIQUE reader.rno,rname,rsex,raddressfrom reader,rb,bookwhere reader.rno=rb.rno and rb.bno=book.bno and book.bname='数据库原理';

子查询:

select RNO,RNAME,RSEX,RADDRESS from READER where RNO in(select rb.rno from rb where rb.bno in( select book.bno from book where book.bname='数据库原理'));


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

答:因为两张表中都有bno,所以要添加表名。

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

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<=ALL(select avg(rage) from reader group by raddress) ;


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

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

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

select * from book where bprice<all(SELECT MIN(book.bprice) FROM BOOK WHERE bname='数据库原理') and bpress<>'清华大学出版社';


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

select READER.RNO,RNAME,RADDRESS from READER;
select * from rb where bno='B001';

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

select reader.rno,rname,raddressfrom reader,rb where reader.rno=rb.rno and rb.bno='B001';


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

select rno,rname,raddress from readerwhere rno !=all(select rb.rno from rb where bno='B001');

9、 查询借阅了所有书籍的员工的姓名;

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 not exists (select * from bookwhere not exists (select * from rb  where reader.rno=rb.rno and rb.bno=book.bno));


10、 查询至少借阅了编号为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 reader.rno, Rname,Rsex,raddress From Reader Where not exists (select * from rb  rb1 where rb1.rno='R004' and not exists (select * from rb rb2 where rb2.rno=reader.rno  and rb1.bno=rb2.bno));


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

Select * from reader where rage>30union select * from reader where raddress='416';

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

Select * from reader where rage>30minus select * from reader where raddress='416';

数据库---数据查询相关推荐

  1. Oracle数据库数据查询语句示例(包含大部分常用语句)

    Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...

  2. 数据库 - 数据查询

    数据查询 语句格式SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] - FROM <表名或视图名>[, <表名或视图名> ...

  3. mysql数据库 数据查询闯关(头哥)

    第1关:简单的单表查询 本关任务:查询PetStore数据库中用户表account中的用户编号是u0001的用户姓名fullname和电话号码phone. 其中account表结构如下: 相关知识 为 ...

  4. 数据库———数据查询

    查询年级为的所有学生的名称,按编号升序排列 Select sid,sname From STUDENTS Where grade='1' Order by sid; 查询学生的选课成绩合格的课程成绩, ...

  5. 10.自定义异常 -- 数据库数据查询异常

    自定义异常 package cn.bingou.exception;public class MsgException extends Exception{public MsgException(){ ...

  6. mysql离散查询_mySQL数据库数据查询操作详解

    查询数据: 简单查询: 1.查询所有数据: select * from 表名 #select * from info 查询所有列 2.查询指定列: select code,name from info ...

  7. MySQL数据库——数据查询(三)

    目录 一.单表查询 1.选择字段 1.1.查询指定字段 1.2.查询所有字段 1.3.查询经过计算的值 1.4.定义字段的别名 2.选择指定记录 2.1.比较大小 2.2.带BETWEEN...AND ...

  8. 数据库----数据查询

    基于中国人民大学 中国慕课数据库系统概论(基础篇) 一.查询语句的基本功能分解 可分为三类. 查询全部信息 (student表中) select * from student; select 是不去重 ...

  9. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码

    jsp与javabean链接mysql数据库并查询数据表的简单实例源码.这个简单的实例是给新手学习的,或者一些高手临时忘记怎么使用jsp操作mysql数据库时候查找的,包括了建立mysql数据库连接的 ...

最新文章

  1. 哈达马积(向量或矩阵)与内积(数字)区别
  2. 吴恩达机器学习 Coursera 笔记(二) - 单变量线性回归
  3. p750tm安装linux系统,Android 开发环境(虚拟机,LINUX, secureCRT)安装过程.pdf
  4. HashMap 和 HashTable 区别
  5. linux安全检测及防护,Linux安全检测及防护-单选题.doc
  6. springmvc常用注解之@Controller和@RequestMapping
  7. Enterprise Library 4.1 快速上手(图)
  8. 贝叶斯参数估计的理解及其在电商算法中的应用
  9. 学习《HTML+CSS基础课程》里的权值
  10. SUMX2MY2函数,你知道什么意思吗?
  11. 海外怎么用网易云听歌,网易云音乐国外用不了怎么办
  12. rasp 系统_RASP相关的技术实现和产品介绍
  13. 这些年,亲眼所见的软件公司中混迹的老油条汇总
  14. Masked Autoencoders
  15. CSMA/CD技术详解
  16. ShaderToy 转换到 Unity中(超级方便的一个工具)
  17. 股指期货风险管理实证研究——以2015年股灾为例实证分析/VaR/EViews
  18. 2021天梯赛 L1-078 吉老师的回归 题解
  19. Python编程学习3:Python 对象引用和 del 删除引用
  20. 山东孔孟之乡-泰山-济南旅游归来

热门文章

  1. uniapp 封装时间选择器组件
  2. nmt模型源文本词项序列_TensorFlow NMT的数据处理过程
  3. incaseformat病毒突发来袭,该如何预防?
  4. excel中如何拷贝已经筛选出来的数据到另外的一表格中
  5. 基于几何关系的车辆轨迹计算
  6. android NFC读取UID
  7. OFD文件怎么转换成PDF格式?这两种方法轻松实现转换
  8. 概率和统计是一回事么?
  9. 追溯笔记本品牌发展史之黑色印记 ---IBM
  10. eclipse如何汉化,把eclipse改成中文版