数据库上机实验一、二

学习完了数据库的基本语法,上机实验也要开始了,在我上一篇关于sql server排序规则排查错误博客中,学习到了很多,具体可以点击此处
下面开始上机实验,因为数据库的实验大多是查询语法,故这里将每一行代码写出,顺便对几个新颖的关键词做一些解释。
对于数据库与表的创建见文章末尾,这里就不再多谈,下面就直接开始我们的22个查询语句吧
使用的教材是《数据库原理与技术——基于sql server2012》李春葆 著。
如果遇到排序规则冲突的情况(一般在SSMS上不会发生),请在条件输入:COLLATE Chinese_PRC_CI_AS
完成不易,你的三连就是我创作的最大动力!
有好的方法欢迎交流,以下思路方法均为个人思路,不一定是最优解!
22个查询语句:

1.查询图书品种的总数目

-- T1
select count(distinct 图书名) as'图书总数' from book2128

2.查询每种图书品种的数目

-- T2
select  图书名,count(*) as'图书数目'
from book2128
group by 图书名

3.查询各班的人数

select d.班号 ,count(s.学号)as'人数'
from depart2128 d,student2128 s
where d.班号=s.班号
group by  d.班号

4.查询各系的人数

select  d.系名,count(s.学号) as'人数'
from depart2128 d,student2128 s
where d.班号=s.班号
group by d.系名

5.查询借阅图书学生的学号、姓名、书名和借书日期

select s.学号,s.姓名,bo.图书名,b.借书日期
from borrow2128 b,student2128 s,book2128 bo
where b.学号=s.学号 and bo.图书编号=b.图书编号

6.查询借有图书的学生的学号和姓名

select  distinct s.学号,s.姓名
from borrow2128 b,student2128 s
where b.学号=s.学号

7.查询每个学生的借书数目

select distinct s.姓名,count(b.图书编号) as'借阅图书数目'
from student2128 s,borrow2128 b
where s.学号=b.学号
group by s.姓名

8.找出借书超过两本的学生的学号、姓名和所借图书册数

select s.学号,s.姓名,count(b.图书编号)as'所借数目'
from student2128 s,borrow2128 b
where  b.学号=s.学号
group by  s.学号, s.姓名
having  count(b.图书编号)>2

9.查询借阅了‘操作系统’一书的学生,输出学号姓名及班号

select s.学号,s.姓名,s.班号
from(
    select  bo.图书名,bo.图书编号,b.学号
    from book2128 bo
    join borrow2128 b on (
        b.图书编号=bo.图书编号 and 图书名='操作系统'
        )
        )a
join student2128 s
on(
    s.学号=a.学号
    )

10.查询每个班的借书总数

select distinct  s.班号,count(b.图书编号)as '借书总数'
from student2128 s, borrow2128 b
where s.学号=b.学号
group by s.班号

11.若图书编号以前3位数字进行分类,查询每类图书的平均价

select  distinct  left(bo.图书编号,3)as'图书编号',avg(bo.定价) as'平均价'
from book2128 bo
group by left(bo.图书编号,3)

12.查询平均价高于30的图书类别

select  distinct  left(bo.图书编号,3)as'图书编号',avg(bo.定价) as'平均价'
from book2128 bo
group by left(bo.图书编号,3)
having  avg(b.定价)>30

13.查询图书类别的平均价,最高价

select  distinct  left(b.图书编号,3)as'图书编号类别',avg(b.定价)as'平均价',max(b.定价)as'最高价'
from book2128 b
group by left(b.图书编号,3)

14.假设借书期限为45天,查询过期未还图书的编号,书名,学生学号和姓名
本题有点小迷,因为没有说什么会过期啊(暂留疑问,后续补上)只要把日期2022-3-17改成相应的还书日期即可

select s.学号,s.姓名,bo.图书编号,bo.图书名
from student2128 s,borrow2128 b,book2128 bo
where s.学号=b.学号 and bo.图书编号=b.图书编号 and datediff(day,b.借书日期,'2022-3-17')>45

15.查询书名包括“工程”关键词的图书,输出书号、书名、作者

select bo.图书编号,bo.图书名,bo.作者
from book2128 bo
where bo.图书名 like '%工程%'

16.查询现有图书中价格最高的图书,输书名以及作者

select 图书名,作者
from book2128
where 定价=(select  max(定价) from  book2128)

17.查询所有借阅“C语言程序设计”一书的学生的学号和姓名,再查询所有 借阅了“C语言程序设计”但没有借“C习题解答”的学生的学号和姓名
(中途使用go)

select  s.学号,s.姓名
from student2128 s,borrow2128 b,book2128 bo
where s.学号=b.学号 and b.图书编号=bo.图书编号 and bo.图书名='C程序设计'

go

select  s.学号 , s.姓名
from student2128 s,borrow2128 b,book2128 bo
where s.学号=b.学号 and b.图书编号=bo.图书编号 and bo.图书名='C程序设计' and not exists(
    select * from  book2128 bo1,borrow2128 b1
    where bo1.图书编号=b1.图书编号 and bo.图书名='C习题解答' and b1.学号=b.学号
    )

18.查询所有没有借书的学生的学号和姓名

select  学号,姓名
from student2128
where  学号 not in(
    select  distinct  学号 from borrow2128
    )

19.查询每个系所借图书的总数

select  d.系名,count(b.学号) as'所借图书的总数'
from depart2128 d,student2128 s,borrow2128 b
where  d.班号=s.班号 and s.学号=b.学号
group by  d.系名

20.查询各出版社的图书总数

select  b.出版社,count(b.图书编号)
from book2128 b
group by  b.出版社

21.查询各出版社的图书占图书总数的百分比(四舍五入到一位小数)

select 出版社,cast(round(count(图书编号)*100.0/(select count(*) from book2128),1) as  numeric(5,1)) as 百分比
from
book2128  b
group by 出版社

22.查询各出版社的图书被借的数目

select  bo.出版社,count(*)as'借书数目'
from book2128 bo,borrow2128 b
where b.图书编号=bo.图书编号
group by bo.出版社

以上是全部题目了,下面附创建数据库与表,并且插入数据的代码:

create  database  Library2128
use Library2128
-- 排序方法
ALTER DATABASE Library2128 COLLATE Chinese_PRC_CI_AS

-- Create Table
create  table depart2128(
    班号 nvarchar(10) not null  primary key ,
    系名 nvarchar(10) not null
)

create  table student2128(
    学号 nvarchar(10) not null primary key ,
    姓名 nvarchar(10) not null ,
    性别 nvarchar(10) not null,
    出生日期 datetime not null,
    班号 nvarchar(10) not null
)

create  table book2128(
    图书编号 nvarchar(10) not null  primary key ,
    图书名 nvarchar(10)  not null,
    作者 nvarchar(10) not null,
    定价 float  not null,
    出版社 nvarchar(10) not null
)


create  table  borrow2128(
    学号 nvarchar(10) not null,
    图书编号 nvarchar(10) not null  primary key (学号,图书编号),
    借书日期 datetime
)

-- Insert values 
insert into book2128(图书编号,图书名,作者,定价,出版社)
values
(	'10011'	,	'C语言设计 '	,	'李洪      '	,	24,	'清华大学出版社 '	)	,
(	'10012'	,	'C语言设计 '	,	'李洪      '	,	24	,'清华大学出版社 '	)	,
(	'10013'	,	'C习题解答 '	,	'李洪      '	,	12	,'清华大学出版社 '	)	,
(	'10014'	,	'C习题解答 '	,	'李洪      '	,	12	,'清华大学出版社 '	)	,
(	'10020'	,	'数据结构  '	,	'徐华      '	,	29	,'人民邮电出版社 '	)	,
(	'10021'	,	'数据结构  '	,	'徐华      '	,	29,	'清华大学出版社 '	)	,
(	'10023'	,	'高等数学  '	,	'王涛      '	,	30	,'高等教育出版社 '	)	,
(	'10034'	,	'软件工程  '	,	'张明      '	,	34	,'机械工业出版社 '	)	,
(	'20025'	,	'信息学    '	,	'张港      '	,	35	,'清华大学出版社 '	)	,
(	'20026'	,	'信息学    '	,	'张港      '	,	35	,'清华大学出版社 '	)	,
(	'20042'	,	'电工学    '	,	'王明      '	,	30	,'人民邮电出版社 '	)	,
(	'20056'	,	'操作系统  '	,	'曾平      '	,	26,	'清华大学出版社 '	)	,
(	'20057'	,	'操作系统  '	,	'曾平      '	,	26	,'清华大学出版社 '	)	,
(	'20058'	,	'操作系统  '	,	'曾平      '	,	26	,'清华大学出版社 '	)	,
(	'20067'	,	'数字电路  '	,	'徐汉      '	,	32	,'高等教育出版社 '	)	,
(	'20140'	,	'数据库原理'	,	'陈曼      '	,	32	,'高等教育出版社 '	)	,
(	'20090'	,	'网络工程  '	,	'黄军      '	,	38	,'高等教育出版社'	)	;
insert into depart2128 values (
        '0501',	'计算机系  '
 )

insert into depart2128 values (
          '0502','计算机系'
                              )

insert  into depart2128 values (
         '0801' ,'电子工程系'
                               )

insert  into depart2128 values (
         '0802','电子工程系'
                               )
insert  into student2128 (学号, 姓名, 性别, 出生日期, 班号)
values
('1',	'张任',      	'男',   	'1995-01-02'	,'0501'),
('2',	'程华',      	'男',   	'1996-01-10',	'0501'),
('3',	'张丽',      	'女',   	'1995-06-07',	'502'),
('4'	,'王英' ,     	'女' ,  	'1994-12-10'	,'0502'),
('5',	'李静',      	'女' ,  	'1995-04-05'	,'0502'),
('10',	'许兵'   ,   	'男',   	'1995-08-10',	'0801'),
('11',	'张功',      	'男',   	'1995-06-02',	'0801'),
('12',	'李华',      	'男',   	'1994-10-03',	'0801'),
('13',	'马超'  ,       '男' , 	'1996-02-03'	,'0802'),
('14',	'曾英',      	'女'   ,	'1994-03-06'	,'0802');

insert  into borrow2128 (学号, 图书编号, 借书日期)
values
('1',	'10020',	'2013-12-05'),
('2',	'20025',	'2013-11-08'),
('1',	'20059',	'2014-04-11'),
('2',	'10011',	'2013-10-02'),
('2',	'10013',	'2014-04-03'),
('3',	'10034'	,'2014-04-10'),
('3',	'20058'	,'2014-04-13'),
('4',	'10012',	'2014-04-06'),
('5',	'10023',	'2014-02-03'),
('12',	'20067',	'2014-03-06')
  • 23
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值