在SQL查询中,一个SELECT-FROM-WHERE查询语句称为一个查询块。将一个查询块嵌入到另一个查询块的WHERE子句或HAVING子句中,称为嵌套子查询。
子查询的结果是集合, 因此使用子查询是集合成员的检查,如:判断元组是否属于某个集合,集合的比较运算,以及测试是否为空集等。
具体表现在如下几个方面:
元素与集合间的属于关系
集合之间的包含和相等关系
集合的存在关系
元素与集合元素之间的比较关系
SQL允许多层嵌套子查询,但在子查询中,不允许使用ORDER BY子句,该子句仅用于最后结果排序。嵌套查询分为相关子查询和非相关子查询。
非相关子查询指子查询的结果不依赖于上层查询。
相关子查询指当上层查询的元组发生变化时,其子查询必须重新执行。
1. 使用IN的子查询
[例3.43]查询选修过课程的学生姓名。
本例查询的含义是:在学生表Student中,将学号出现在成绩表Score中(表明该学生选修过课程)的学生姓名查询出来。
SELECT Sno,Sname FROM Students WHERE Sex = '女' AND Speciality IN (
SELECT Speciality FROM Students WHERE Sname ='王丽丽'
);
2、使用集合的比较引出的子查询
元素与集合元素之间还存在更为复杂的关系,如比较关系,常用到谓词ANY(或SOME)和ALL
ANY表示子查询结果中的某个值
ALL表示子查询结果中的所有值
SELECT Sno,Sname,Speciality,Birthday FROM Students WHERE Speciality
<> '软件工程' AND Birthday > ALL(
SELECT Birthday FROM Students WHERE Speciality = '软件工程'
);
3、存在量词EXISTS引出的子查询
SQL查询提供量词运算量词有两种:
一是存在量词
二是全称量词
在离散数学中,全称量词可用存在量词替代。SQL仅提供存在量词的运算,使用谓词EXISTS表示。全称量词转化通过NOT EXISTS谓词来实现。WHERE子句中的谓词EXISTS用来判断其后的子查询的结果集合中是否存在元素。谓词EXISTS大量用于相关子查询中。
[例3.50]查询选修了“计算机原理”课程的同学姓名、所在班级编号。
SELECT Sno,Sname FROM Students S WHERE EXISTS (
SELECT * FROM SC WHERE Sno=S.Sno AND Cno = 'CS403');
本文介绍了SQL中的嵌套查询,包括子查询的概念、使用场景和类型,如IN子查询、集合比较子查询以及存在量词EXISTS子查询。通过示例展示了如何利用子查询来查询满足特定条件的数据,如查询选修过课程的学生和与特定专业生日对比等。
3966

被折叠的 条评论
为什么被折叠?



