查表

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

 

实验名称:       数据查询       

实验类型:      设计型实验     

指导教师:        乔虹        

 

成绩:__________________________


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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
汇编查表,或者叫做查找表,在汇编语言中常常用于处理一些复杂的计算和逻辑运算。它的基本思想是建立一个表格(数组),将需要进行计算或者判断的数据存储在表格中,并使用一个索引值来访问表格中的数据,从而实现复杂的运算或判断。 下面是一个简单的汇编查表的示例: ```assembly ; 假设需要计算1~10的平方值 section .data table: dw 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 section .text global _start _start: mov ecx, 1 ; 循环计数器初始化为1 loop_start: cmp ecx, 11 ; 如果计数器大于10,退出循环 jg loop_end mov eax, ecx ; 将计数器的值保存到eax寄存器中 shl eax, 1 ; 计算eax的平方值 mov ebx, table ; 将table的地址保存到ebx寄存器中 movsx edx, word [ebx+eax*2] ; 使用eax作为索引值来访问table中的数据 ; 这里使用movsx指令来将访问到的数据扩展为有符号数 ; 如果不需要扩展,可以使用mov指令来代替 ; 如果table中的数据是字节类型,可以使用movzx指令将其扩展为无符号数 ; 如果table中的数据是双字类型,可以使用movd指令来将其加载到xmm寄存器中 ; 如果table中的数据是浮点类型,可以使用movss或者movsd指令来将其加载到xmm寄存器中 ; 具体指令的选择需要根据实际情况而定 ; 将访问到的数据保存到eax寄存器中 ; 这里假设table中的数据是双字类型,因此使用mov eax, edx指令来保存数据 call print_eax ; 输出eax寄存器中的值 inc ecx ; 计数器加1 jmp loop_start loop_end: mov eax, 1 int 0x80 ; 退出程序 print_eax: ; 这里可以使用一些输出eax寄存器中的值的函数来实现输出操作 ; 具体实现方法需要根据实际情况而定 ; 这里的代码只是一个示例,不能直接使用 ret ``` 在上面的例子中,我们使用一个table数组来存储1~10的平方值。然后使用一个循环来遍历1~10,每次循环计算出当前数的平方值,并使用计算结果作为索引值来访问table数组中的数据,最后输出访问到的数据。这样,就可以通过查表的方式快速地计算出1~10的平方值,而不需要每次都进行一次乘法运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值