《数据库原理与应用》课程实验报告四 --数据库的组合和统计查询

《数据库原理与应用》课程实验报告 数据库的组合和统计查询

使学生进一步掌握SQL Server查询的使用方法,加深对T-SQL语言查询语句的理解。熟练掌握数据查询中的分组、统计、计算和组合的操作方法。

二、实验过程及分析

1.实验内容

1、分组查询实验。该实验包括分组条件表达、选择组条件的表达方法。
2、使用函数查询的实验。该实验包括统计函数和分组统计函数的使用方法。
3、组合查询实验。
4、计算和分组计算查询的实验。

2.实验过程

创建图书表
create table 图书
(
  书号  varchar(10) primary key,
  书名 varchar(20)not null,
  类别 varchar(20),
  作者 varchar(10),
  出版社 varchar(20),
  定价   int
)
select *  from 图书
drop table  图书  
--插入数据
insert into  图书 values ('B101','数据结构','计算机类','陈越','清华出版社',38),
                         ('j0002','操作系统','计算机类','李祥','科学出版社',35),
						 ('j0001','数据库技术','计算机类','苗雪兰','清华出版社',25),
						 ('W100','明朝那些事','文学类','当年明月','北京联合出版社',38),
						 ('Y101','大学英语','英语类','李靖','机械工业出版社',20),
						 ('Y102','专业英语','英语类','jack','机械工业出版社',30),
						 ('Y103','科技英语','英语类','meric','机械工业出版社',150),
						 ('B102','数据库','计算机类','kkkk','机械工业出版社',89),
						 ('B103','计算机组成原理','计算机类','qqq','机械工业出版社',79),
						 ('B104','计算机概论','计算机类','oo','机械工业出版社',100)
						
--创建读者表
create table 读者
(
  读者编号 int primary key,
  姓名 varchar(20)not null,
  单位 varchar(20),
  性别 varchar(10),
  电话 varchar(11)
)
select *  from 读者
drop table  读者

--插入数据
insert into  读者 values(1801,'张三','生工院','男',12345678901),
                        (1802,'李白','机械院','女',12345678901),
						(1803,'翠花','英语院','男',12345678901),
						(1804,'狗蛋','思政院','男',12345678901)


--创建借阅表
create table    借阅表
(
  书号  varchar(10),
  读者编号 int,
  借书日期  date  not null,
  还书日期   date
  primary key (书号,读者编号),
  foreign key(书号) references 图书(书号),
  foreign key(读者编号) references 读者(读者编号)
)

select *  from 借阅表
drop table  借阅表
--插入数据
insert  into  借阅表  values  ('j0001',1801,'2019-01-01','2020-01-01'),
                                ('j0001',1802,'2019-12-11','2020-01-03'),
								('W100',1802,'2019-12-11','2020-01-03'),
								('B102',1802,'2019-12-11','2020-01-03'),
								 ('Y102',1803,'2019-12-30','2020-04-01'),
								  ('j0002',1801,'2019-01-01','2019-03-03'),
								  ('j0002',1804,'2019-04-01','2019-12-12'),
								  ('Y103',1801,'2019-05-01','2019-10-30'),
								  ('Y103',1802,'2018-12-30','2019-12-01'),
								  ('B103',1802,'2019-12-30','2019-12-01'),
								  ('Y103',1803,'2019-07-01','2019-12-18')

查询操作

--1、查找每个出版社所出版图书的最高价。
select    出版社, max(定价) as 最高价  from   图书   group by 出版社

--2、查找借阅图书超过3本的读者编号和借书册数,要求只统计2019-12-10以后的借书情况。
select  读者编号  , count(*) 借书册数   from   借阅表 where  借书日期 > '2019-12-10' 
                         group by  读者编号 having  count(*)>3

--3、查找读者的借阅情况,即读者编号、借书册数,并进行借书情况汇总。
select  读者编号 ,  COUNT(书号) as  册数 
from 借阅表
group  by   读者编号 

--4、求机械工业出版社出版的各类图书的平均定价,用GROUP BY表示。
select 类别  , AVG(定价)
from 图书 where  出版社='机械工业出版社'
group  by   类别

--5、按照年份统计每个读者的借书册数,并进行汇总。
select  读者编号 , YEAR(借书日期) as 年份 , COUNT(书号) as  册数 
from 借阅表
group  by   读者编号 ,YEAR(借书日期)

--6、查询借阅了书号为“j0001”或“j0002”的读者编号。
select  读者编号 
from  借阅表 
where  书号= 'j0001'
union
select  读者编号 
from  借阅表 
where  书号= 'j0002'

--7、查询既借阅了书号为“j0001”,又借阅了书号为“j0002”的读者编号。
select  读者编号 
from  借阅表 
where  书号= 'j0001'
intersect
select  读者编号 
from  借阅表 
where  书号= 'j0002'

--8查询借阅了书号为“j0001”,但没有借阅书号为“j0002”的读者编号。
select  读者编号 
from  借阅表 
where  书号= 'j0001'
except
select  读者编号 
from  借阅表 
where  书号= 'j0002'

--9、查找这样的图书类别:要求类别中最高的图书定价不低于按类别分组的图书平均定价的2倍。
select 类别
from  图书
group by  类别 having max(定价) >= 2*AVG(定价)

3.实验结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.实验分析

①分析实验结果;
顺利的完成实验
②说明实验过程中遇到的问题及怎么解决。
不能正确
查找借阅图书超过3本的读者编号和借书册数,要求只统计2019-12-10以后的借书情况
要正确的使用聚集函数,以及where 和 having的区别

select  读者编号  , count(*) 借书册数   from   借阅表 where  借书日期 > '2019-12-10' 
                         group by  读者编号 having  count(*)>3

③对错误方面进行分析;
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件 显示特定的组,也可以使用多个分组标准进行分组。

三、实验总结

①.对本次实验掌握程度如何;
完成度8成
②.是否在规定的时间内完成,没完成的原因是什么;
没有,没能熟练的使用sql语句。
③.总结操作错误或无法得到结果的原因)
Where 和having 区别
1.类型:
“Where”是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”;
“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”。

2.使用的角度:
where后面之所以不能使用聚合函数是因为where的执行顺序在聚合函数之前,
如下面这个sql语句:select sum(score) from student group by student.sex where sum(student.age)>100;
having既然是对查出来的结果进行过滤,那么就不能对没有查出来的值使用having,
如下面这个sql语句: select student.id,student.name from student having student.score >90;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值