【2020-2021春学期】数据库作业7:嵌套查询例题练习

嵌套查询

✦相关概念:

  1. 一个select-from-where语句称为一个查询块。
  2. 将一个查询块嵌套在另一个查询块的where或having短语的条件的查询称为嵌套查询。
  3. 外层查询称为父查询,内层查询称为子查询。
  4. 不相关子查询:子查询的查询条件不依赖于父查询,相关查询则相反。

1.带有IN谓词的子查询

【例3.55】查询与“刘晨”在同一个系学习的学生。
select Sno,Sname,Sdept
from Student
where Sdept IN
	(select Sdept
	from Student
	where Sname='刘晨'); --此查询为不相关子查询(由里向外)

在这里插入图片描述
此题还有其他两种解法,一种是分步查询,一种是自身连接查询。

【例3.56】查询选修了课程名为“信息系统”的学生学号和姓名。
select Sno,Sname
from Student
where Sno IN
	(select Sno
	from SC
	where Cno IN
		(select Cno
		from Course
		where Cname='信息系统')
	);

在这里插入图片描述
也可以用连接查询做,连接三个表就可以了。结果同上图。

SELECT Student.Sno,Sname
FROM  Student,SC,Course
WHERE Student.Sno = SC.Sno  AND
      SC.Cno = Course.Cno AND
      Course.Cname='信息系统';

2.带有比较运算符的子查询

【例3.57】找出每个学生超过他选修课程平均成绩的课程号。
select Sno,Cno
from SC x
where Grade>=(select AVG(Grade)
			 from SC y
			 where x.Sno=y.Sno);

这题我理解了半天,感觉把思路写写记忆更深。首先判断是不是相关子查询,是,那么就是从外向里看,但这里的从外向里可以和嵌套循环结合起来理解,就是外循环拿一个数到内循环,在这里就是在外查询拿一个Sno到内循环,这样内循环就好理解了。

3.带有ANY(SOME)或ALL的子查询

【例3.58】查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。
select Sname,Sage
from Student
where Sage <ANY (select Sage
				 from student 
				 where Sdept='CS')
and Sdept != 'CS';
【例3.59】查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
select Sname,Sage
from Student
where Sage <ALL (select Sage
				 from student 
				 where Sdept='CS')
and Sdept != 'CS';

4.带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值true或逻辑假值false。(not exists相反)
● 若内查询结果非空,则外层的where子句返回真值
● 若内查询结果为空,则外层的where子句返回假值

由exists引出的子查询,其目标列表达式通常是 * ,因为在exists列名无意义。

【例3.60】查询所有选修了1号课程的学生姓名。
select Sname 
from student
where exists
	(select *
	from SC
	where SC.Sno=Student.Sno and Cno='1');

在这里插入图片描述
不同形式的查询间的替换:
在这里插入图片描述

用exists实现全称量词:

在这里插入图片描述

【例3.62】查询选修了全部课程的学生姓名。
select Sname
from Student
where not exists 
	(select *
	from Course
	where not exists 
		(select *
		from SC
		where SC.Sno=Student.Sno 
		and   SC.Cno=Course.Cno
		)
	);

在这里插入图片描述

用EXISTS / NOT EXISTS实现逻辑蕴涵:

在这里插入图片描述

【例3.63】查询至少选修了学生201215122选修的全部课程的学生号码。

在这里插入图片描述

select DISTINCT Sno 
from SC SCX
where not exists
	(select *
	from SC SCY
	where Sno='201215122' and not exists
		(select *
		from SC SCZ
		where SCZ.Sno=SCY.Sno and
			  SCZ.Cno=SCX.Cno));

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值