查表

  数据库原理及应用实验报告

 

实验名称:       数据查询       

实验类型:      设计型实验     

指导教师:        乔虹        

 

成绩:__________________________


        1. 实验目的
  1. 掌握查询语句的一般格式
  2. 熟练掌握单表查询、连接查询、集合查询、统计查询和嵌套查询
        1. 实验环境

1.Windows10

2.Oracle 11g 企业版

        1. 实验内容

1.单表查询

2.连接查询

3.嵌套查询

4.集合查询

        1. 实验步骤

1、 查询“红楼梦”目前可借的各图书编号,及所属版本信息。(是否借出为‘否‘的图书)

2、查找高等教育出版社的所有书目及单价,结果按单价降序排序。

3、统计“红楼梦”各版的藏书数量(ISBN不同则版本不同)。

4、查询学号“20061234”号借书证借阅未还的图书的信息。

5、查询各个出版社的图书最高单价、平均单价。

6、要查询借阅了两本和两本以上图书的读者的个人信息。

7、查询“王菲”的单位、所借图书的书名和借阅日期。

8、查询每类图书的册数和平均单价。

9、统计从未借书的读者人数。

10、统计参与借书的人数。

11、找出所有借书未还的读者的信息及所借图书编号及名称。

12、检索书名是以“Internet”开头的所有图书的书名和作者。

13、查询各图书的罚款总数。

14、查询借阅及罚款分类信息,如果有罚款则显示借阅信息及罚款名称、罚金,如果没有罚款则罚款名称、罚金显示空(左外连接)

15、查询借阅了所有“文学”类书目的读者的姓名、单位。

实验结果

  1. 查询“红楼梦”目前可借的各图书编号,及所属版本信息。(是否借出为‘否‘的图书)

 

select 图书编号,出版单位 from 图书,书目 where 图书.ISBN=书目.ISBN and 图书.是否借出='否' 

  1. 查找高等教育出版社的所有书目及单价,结果按单价降序排序。

select 书名,单价 from 书目 where 出版单位='高等教育出版社'

  1. 统计“红楼梦”各版的藏书数量(ISBN不同则版本不同)。

select ISBN,count(ISBN) from 书目 where 书名='红楼梦' group by isbn

  1. 查询学号“20061234”号借书证借阅未还的图书的信息。

 

select * from 书目 where isbn in (select isbn from 图书 where 图书编号 in (

      select 图书编号 from 借阅 where 借书证号=20061234 and 归还日期 is null

))

 

  1. 查询各个出版社的图书最高单价、平均单价。

select max(单价),avg(单价) from 书目 group by 出版单位

  1. 要查询借阅了两本和两本以上图书的读者的个人信息。

select * from 读者 where 借书证号 in (

       select 借书证号 from 借阅 group by 借书证号 having count(借书证号)>2)

  1. 查询“王菲”的单位、所借图书的书名和借阅日期。

select 单位,书名 , 借书日期 from 借阅,读者,图书,书目 where 读者.姓名='王菲' and 读者.借书证号=借阅.借书证号 and 借阅.图书编号=图书.图书编号 and 图书.isbn=书目.isbn

  1. 查询每类图书的册数和平均单价。

select count(图书.isbn),avg(单价) from 图书,书目 where 图书.isbn=书目.ISBN group by 图书.isbn

  1. 统计从未借书的读者人数。

select count(借书证号) from 读者 where not exists (

       select * from 借阅 where 借阅.借书证号=读者.借书证号

)

  1. 统计参与借书的人数。

select count(借书证号) from 读者 where  exists (

       select * from 借阅 where 借阅.借书证号=读者.借书证号

)

  1. 找出所有借书未还的读者的信息及所借图书编号及名称。

select 读者.*,借阅.图书编号,书目.书名

from 读者,借阅,图书,书目

where 借阅.归还日期 is null 

and 借阅.借书证号=读者.借书证号

and 借阅.图书编号=图书.图书编号

and 图书.ISBN=书目.ISBN

  1. 检索书名是以“Internet”开头的所有图书的书名和作者。

select 书名,作者 from 书目 where 书名='Internet%'

  1. 查询各图书的罚款总数。

select sum(罚金) from 借阅,罚款分类 where 借阅.罚款分类号=罚款分类.罚款分类号

  1. 查询借阅及罚款分类信息,如果有罚款则显示借阅信息及罚款名称、罚金,如果没有罚款则罚款名称、罚金显示空(左外连接)

select 借阅.*,罚款名称,罚金 from 借阅 left outer join 罚款分类 on  (借阅.罚款分类号=罚款分类.罚款分类号)

  1. 查询借阅了所有“文学”类书目的读者的姓名、单位。

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;

  1. 求总藏书量、藏书总金额、最高价、最低价。

select count(图书编号) 总藏书量,sum(单价) 藏书总金额,max(单价) 最高价,min(单价) 最低价 from 图书,书目where 图书.isbn=书目.ISBN

  1. 列出藏书在5本以上的书目(书名、作者、出版社、出版年份)。

select 书名,作者,出版单位,出版年份 from 书目 where 书目.ISBN in (

       select 图书.isbn from 图书 group by 图书.isbn having count( 图书.isbn)>5

)

  1. 列出年份最久远的书?

select 书名,作者,出版单位,出版年份 from 书目 where 书目.出版年份 in (

      select min(书目.出版年份) from 书目)

  1. 目前实际已借出多少册书?

select count(借阅.借阅流水号) 借出数量 from 借阅 where 归还日期 is null

6.哪一年的图书最多?

select * from (

select 出版年份,count(出版年份) 数量  from 图书,书目 where 图书.isbn=书目.isbn   group by 出版年份 order by count(出版年份) desc 

) where rownum=1;

  1. 哪本借书证未归还的图书最多?

select * from (

select 借书证号 from 借阅 where 归还日期 is null group by 借书证号 order by count(借书证号) desc

) where rownum=1

  1. 平均每本借书证的借书册数。

select 借书证号, count(借书证号) from 借阅 group by 借书证号

  1. 哪个单位的读者平均借书册数最多?

select 读者.单位 from 读者 where 读者.借书证号 in (

select 借书证号 from (

select 借书证号, count(借书证号) from 借阅 group by 借书证号 order by  count(借书证号) desc 

) where rownum=1)

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

  1. 今年未借过书的借书证。

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

)

        1. 实验心得与体会(遇到的问题以及解决)

遇到的问题: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语句,现实中的需求还是很具体的,包括这次的练习,虽然一些要求查找的内容都能直接和数据库中的表一一对应,但是还有很多需要自己抽象与分析的,与程序设计一样要进行缜密分析,特别要考虑一些异常情形。

你可能感兴趣的:(查表)