学习完了数据库的基本语法,上机实验也要开始了,在我上一篇关于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')