数据库原理及应用实验报告
实验名称: 数据查询
实验类型: 设计型实验
指导教师: 乔虹
成绩:__________________________
1.Windows10
2.Oracle 11g 企业版
1.单表查询
2.连接查询
3.嵌套查询
4.集合查询
1、 查询“红楼梦”目前可借的各图书编号,及所属版本信息。(是否借出为‘否‘的图书)
2、查找高等教育出版社的所有书目及单价,结果按单价降序排序。
3、统计“红楼梦”各版的藏书数量(ISBN不同则版本不同)。
4、查询学号“20061234”号借书证借阅未还的图书的信息。
5、查询各个出版社的图书最高单价、平均单价。
6、要查询借阅了两本和两本以上图书的读者的个人信息。
7、查询“王菲”的单位、所借图书的书名和借阅日期。
8、查询每类图书的册数和平均单价。
9、统计从未借书的读者人数。
10、统计参与借书的人数。
11、找出所有借书未还的读者的信息及所借图书编号及名称。
12、检索书名是以“Internet”开头的所有图书的书名和作者。
13、查询各图书的罚款总数。
14、查询借阅及罚款分类信息,如果有罚款则显示借阅信息及罚款名称、罚金,如果没有罚款则罚款名称、罚金显示空(左外连接)
15、查询借阅了所有“文学”类书目的读者的姓名、单位。
实验结果
select 图书编号,出版单位 from 图书,书目 where 图书.ISBN=书目.ISBN and 图书.是否借出='否'
select 书名,单价 from 书目 where 出版单位='高等教育出版社'
select ISBN,count(ISBN) from 书目 where 书名='红楼梦' group by isbn
select * from 书目 where isbn in (select isbn from 图书 where 图书编号 in (
select 图书编号 from 借阅 where 借书证号=20061234 and 归还日期 is null
))
select max(单价),avg(单价) from 书目 group by 出版单位
select * from 读者 where 借书证号 in (
select 借书证号 from 借阅 group by 借书证号 having count(借书证号)>2)
select 单位,书名 , 借书日期 from 借阅,读者,图书,书目 where 读者.姓名='王菲' and 读者.借书证号=借阅.借书证号 and 借阅.图书编号=图书.图书编号 and 图书.isbn=书目.isbn
select count(图书.isbn),avg(单价) from 图书,书目 where 图书.isbn=书目.ISBN group by 图书.isbn
select count(借书证号) from 读者 where not exists (
select * from 借阅 where 借阅.借书证号=读者.借书证号
)
select count(借书证号) from 读者 where exists (
select * from 借阅 where 借阅.借书证号=读者.借书证号
)
select 读者.*,借阅.图书编号,书目.书名
from 读者,借阅,图书,书目
where 借阅.归还日期 is null
and 借阅.借书证号=读者.借书证号
and 借阅.图书编号=图书.图书编号
and 图书.ISBN=书目.ISBN
select 书名,作者 from 书目 where 书名='Internet%'
select sum(罚金) from 借阅,罚款分类 where 借阅.罚款分类号=罚款分类.罚款分类号
select 借阅.*,罚款名称,罚金 from 借阅 left outer join 罚款分类 on (借阅.罚款分类号=罚款分类.罚款分类号)
select distinct(读者.姓名) ,读者.单位 from 读者,借阅,书目,图书,图书分类 where
借阅.借书证号=读者.借书证号 and 借阅.图书编号=图书.图书编号
and 图书.ISBN=书目.ISBN and 书目.图书分类号=图书分类.图书分类号 and 图书分类.类名='文学'
扩展
1、在书目关系中新增“出版年份”,并在该属性下添加数据。(使用SQL完成)
ISBN |
书名 |
作者 |
出版单位 |
出版年份 |
单价 |
图书 分类号 |
7040195836 |
数据库系统概论 |
王珊 |
高等教育出版社 |
2005 |
39.00 |
200 |
9787508040110 |
红楼梦 |
曹雪芹 |
人民出版社 |
1983 |
20.00 |
100 |
9787506336239 |
红楼梦 |
曹雪芹 |
作家出版社 |
2008 |
34.30 |
100 |
9787010073750 |
心学之路 |
张立文 |
人民出版社 |
2009 |
33.80 |
300 |
alter table 书目 ADD 出版年份 number
update 书目 set 出版年份=2005 where isbn=7040195836;
update 书目 set 出版年份=1983 where isbn=9787508040110;
update 书目 set 出版年份=2008 where isbn=9787506336239;
update 书目 set 出版年份=2009 where isbn=9787010073750;
select count(图书编号) 总藏书量,sum(单价) 藏书总金额,max(单价) 最高价,min(单价) 最低价 from 图书,书目where 图书.isbn=书目.ISBN
select 书名,作者,出版单位,出版年份 from 书目 where 书目.ISBN in (
select 图书.isbn from 图书 group by 图书.isbn having count( 图书.isbn)>5
)
select 书名,作者,出版单位,出版年份 from 书目 where 书目.出版年份 in (
select min(书目.出版年份) from 书目)
select count(借阅.借阅流水号) 借出数量 from 借阅 where 归还日期 is null
6.哪一年的图书最多?
select * from (
select 出版年份,count(出版年份) 数量 from 图书,书目 where 图书.isbn=书目.isbn group by 出版年份 order by count(出版年份) desc
) where rownum=1;
select * from (
select 借书证号 from 借阅 where 归还日期 is null group by 借书证号 order by count(借书证号) desc
) where rownum=1
select 借书证号, count(借书证号) from 借阅 group by 借书证号
select 读者.单位 from 读者 where 读者.借书证号 in (
select 借书证号 from (
select 借书证号, count(借书证号) from 借阅 group by 借书证号 order by count(借书证号) desc
) where rownum=1)
select * from 图书,书目,借阅 where 图书.图书编号=借阅.图书编号 and 书目.isbn=图书.isbn
and 借阅.借书日期 between to_date('2017-1-1 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2018-12-31 23:59:59','yyyy-mm-dd hh24:mi:ss')
select 读者.借书证号 from 读者 where not exists(
select 借阅.借书证号 from 借阅 where 借阅.借书日期 between to_date('2018-1-1 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2018-12-31 23:59:59','yyyy-mm-dd hh24:mi:ss')
)
遇到的问题:not exists 的使用和理解
解决:网上查询之后,以及自己在数据库里使用了解了not exists的含义
遇到的问题:oracle的日期between and 使用
解决:网上查询后了解到oracle 和其他sql语句不通,需要加上to_data函数转换才行
遇到的问题:如何获取查询结果的第一列数据
解决:在末尾用limit 1来取到第一行数据
遇到的问题:如何获取出现次数最多字段的数据
解决:在group by 字段 后 加上order by count(字段)desc 查询出来的数据第一行就是出现次数最多的
实验心得与体会:
SQL语句很基础又很灵活,在实验课上,需要自己根据要求编写sql语句,但是每遇到一个题,都需要重新构思,把所有的表都看一遍才能决定从哪里入手,总之sql语句不熟练,还需要很多练习。
大部分因为不熟练,还需要网上搜索,但是很多都是不满足查询需求的,自己的sql语句还不是很熟练需要多多练习。
但是自己在写sql语句的时候更加了解了连接查询,嵌套查询的使用,还学习了一些技巧,更多用的是单表查询,集合查询因为不了解也不知道有没有用到。
总之要能够把具体的需求语句准确抽象出SQL语句,现实中的需求还是很具体的,包括这次的练习,虽然一些要求查找的内容都能直接和数据库中的表一一对应,但是还有很多需要自己抽象与分析的,与程序设计一样要进行缜密分析,特别要考虑一些异常情形。