SQL server数据库实验(三)数据库的嵌套查询和集合查询


一、针对教学管理数据库SCT,进行以下各种嵌套查询与集合查询

1.查询选修了“数据库”课程的学生信息

select *
from STUDENT055
where SNO in
	(select SNO
		from SCT055
		where CNO in
		(select CNO
			from COURSE055
			where CNAME = '数据库'
		)
	);

2.查询与学生“李维”在同一个院系的学生选课信息(包括李维)

select *
from SCT055
	where SNO in
	(select SNO
		from STUDENT055
		where SDEPT in
		(select SDEPT
			from STUDENT055
			where SNAME = '李维'
		)
	);

3.对每个选修了课程的学生,查询他获得最高成绩的课程号和成绩

select SNO,CNO,GRADE
from SCT055
where GRADE in
	(select MAX(GRADE)
		from SCT055
		group by SNO
	)

4.查询与“王丽”职称相同的其他女教师信息

select *
from TEACHER055
where TITLE in
	(select TITLE
		from TEACHER055
		where TNAME = '王丽'
	) 
	and TSEX = '女';

5.查询教师“周小平”和“王建宁”的授课信息,结果按照教师号升序显示

select distinct TNO,CNO
from SCT055
where TNO in
	(select TNO
		from TEACHER055
		where TNAME = '周小平' or TNAME = '王建宁'
	)
order by TNO;

6.查询至少选修了学生“李维”所选的所有课程的其他学生信息

SQL语句中没有蕴涵逻辑运算,但是可以利用谓词演算等价转换,它所表达的语义为:不存在这样的课程y,学生李维选修了y,而学生x没有选。

select *
from STUDENT055
where SNO in
(
	select distinct SNO
	from SCT055 STU1
	where not exists
		(select *
			from SCT055 STU2
			where STU2.SNO in
			(select SNO 
				from STUDENT055
				where SNAME = '李维'
			)
			and
				not exists
				(select *
					from SCT055 STU3
					where STU3.SNO = STU1.SNO and
						STU3.CNO = STU2.CNO))
);

7.查询至少选修了“数据库”和“C语言”课程的学生信息

intersect取交集

select *
from STUDENT055
where SNO in(
	select SNO 
	from SCT055
	where CNO in(
		select CNO
		from COURSE055
		where CNAME = '数据库'
	)
)
intersect
select  *
from STUDENT055
where SNO in(
	select SNO 
	from SCT055
	where CNO in(
		select CNO
		from COURSE055
		where CNAME = 'C语言'
	)
)

8.查询“计算机”学院与“电子”学院的女学生信息

union求并集

select *
from STUDENT055
where SSEX = '女' and SDEPT = '计算机'
union
select *
from STUDENT055
where SSEX = '女' and SDEPT = '电子'

9.查询选修了“C语言”但是未选修“数据库”课程的学生信息

差集

select *
from STUDENT055
where SNO in(
	select SNO 
	from SCT055
	where CNO in(
		select CNO
		from COURSE055
		where CNAME = 'C语言'
	)
)
except
select  *
from STUDENT055
where SNO in(
	select SNO 
	from SCT055
	where CNO in(
		select CNO
		from COURSE055
		where CNAME = '数据库'
	)
)

10.查询学分是3或4的课程信息

select *
from COURSE055
where CREDIT = '3'

union

select *
from COURSE055
where CREDIT = '4'

11.查询无人选修的课程的详细信息

select *
from COURSE055
where CNO in(
	select CNO
	from COURSE055
)
except
select *
from COURSE055
where CNO in(
	select distinct CNO
	from SCT055
)

二、针对教学管理数据库SCT,进行以下各种查询:

(以下题目不限制查询方法)

1.查询选修了“CS-001”课程,且成绩为第3到第5名的学生姓名,要求按照成绩的降序输出

按照逻辑应该是top5减去top2,但是这样在SQL server2019里得不到正确答案,必须用top5减去top3才能得到第3到第5名。
没有排序order by时 返回记录默认从高到低,由于GRADE的index是降序,所以order by GRADE直接得到降序输出

select top 5 SNAME,GRADE
from STUDENT055,SCT055
where CNO = 'CS-001' and
		SCT055.SNO = STUDENT055.SNO

except
select top 3 SNAME,GRADE
from STUDENT055,SCT055
where CNO = 'CS-001' and
		SCT055.SNO = STUDENT055.SNO

order by GRADE

2.查询各门课程选修学生数占学生总数的百分比;(没有学生选修的课程也要考虑)

convert转换成浮点数相除,concat函数加上百分号,没有学生选修的课程也要考虑所以使用左外连接。

select CNAME,concat(convert(float,count(SCT055.SNO))/(
	select count(*)
	from STUDENT055
)*100,'%') as '选课人数占比'
from COURSE055 left join SCT055
on COURSE055.CNO = SCT055.CNO
group by COURSE055.CNAME
order by count (*) desc

3.查询选课门数唯一的学生姓名(选课门数与其他学生都不相同)。(只考虑选修了课程的学生)

select SNAME
from STUDENT055
where SNO in(
	select X.SNO
	from STUDENT055 X,SCT055
	where X.SNO = SCT055.SNO
	group by X.SNO
	having count(CNO) not in(
		select count(CNO)
		from STUDENT055 Y,SCT055
		where Y.SNO = SCT055.SNO and Y.SNO !=X.SNO
		group by Y.SNO
	)
)
  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、基于实验一建立的 “图书读者数据库”(Book_Reader_DB),输入部分虚拟数据;假定实验一的实验后的结果数据库的关系模式如下: 图书(书号,类别,出版社,作者,书名,定价,数量,购买日期,备注) 读者(编号,姓名,单位,性别,电话) 借阅(书号,读者编号,借阅日期,还书日期) 2、打开查询分析器,并建立与服务器的连接,在数据库对象下拉框中选择“Book_Reader_DB”,在查询分析器输入区中输入Transact-SQL语句,然后点击“查询”菜单中的“执行”菜单项(或用F5快捷键),执行输入区的Transact-SQL语句,如下图所示; 3、用连接查询嵌套查询的方法实现下列查询 在“图书读者数据库”(Book_Reader_DB)中,用连接查询的方法完成下列查询任务: ① 查询借阅了类别为“环境”类图书的所有读者编号、姓名及单位; ② 查询借阅过图书的读者编号、姓名及单位; ③ 查询姓名为“李明”的读者目前借阅的图书书号和书名; ④ 查询借书过期的所有读者姓名及所借图书名(假定借阅期为60天); ⑤ 查询没有借阅过图书的所有读者姓名; ⑥ 查询借出次数超过10次的所有图书的书号和书名; ⑦ 查询除已还的书以外,目前借了5本或以上图书的读者编号和姓名; ⑧ 查询书库中除借出的图书外,现存的图书书号、书名、现存数量;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值