子查询
在SQL语句中,一个select-from-where语句称为一个查询块。如果一个select语句嵌套在一个select,insert,update或delete语句中,则称之为子查询或者内存查询。包含子查询的语句则称为主查询或者外层查询
子查询语句一般出现在where和having子句中
写在where中的子句中的子查询一般有下面的形式
- WHERE <列名> [NOT] IN (子查询) // (集合
- WHERE <列名> 比较运算符 (子查询) //(单值
- WHERE EXISTS (子查询) //(是否空值
例如:
使用子查询进行基于集合的查询
//查询与钟文辉同学在同一个系的同学
//第一步先查询钟文辉同学所在的系
//然后把系作为已知条件查找同学信息
SELECT * FROM Student
WHERE Sdept IN(
SELECT Sdept FROM Student Where Sname ='钟文辉') ;
使用子查询进行比较查询
//查询选修了C04课程且课程成绩高于此课程平均成绩的的学生学号和该门课成绩
//先查出C04课程的平均成绩
//然后把平均成绩作为已知条件查找同学学号和成绩
SELECT Sno, Grade FROM SC
WHERECno='C04' AND Grade>(
SELECT AVG(Grade) FROM SC Where Cno ='C04') ;
带有ANY和ALL的子查询
//查询比C03课程成绩都高的选了C04课程的学生的学号和成绩
SELECT Sno, Grade FROM SC
WHERECno='C04' AND Grade>ALL(
SELECT Grade FROM SC Where Cno ='C03') ;
使用带EXSITS谓词的子查询
//查询选修了C04课程且课程的学生姓名
SELECT Sname FROM SC
WHERE EXISTS(
SELECT * FROM SC
Where SC.Sno=Student.Sno AND Cno ='C04');
注意,带exists谓词的子查询是先执行外层,再执行内层查询,根据内存查询返回的true和false来判断外层数据是否满足条件。
查询的集合运算
SQL提供与关系代数中集合并,交,差对应的谓词,他们分别是UNION,INTERSECT,EXCEPT,当使用这些操作进行查询时,参与运算的两个查询分别用括号括起来。
例如:
//查询计算机系和机电系的所有学生信息
( SELECT *FROM Student
WHERE Sdept='计算机系')
UNION
( SELECT *FROM Student
WHERE Sdept='机电系')
//查询同时选修了C03和C04课程的学生的学号
(SELECT Sno FROM SC WHERE Cno='C03')
INTERSECT
(SELECT Sno FROM SC WHERE Cno='C04')
//查询选修了C01但是没有选修C02课程的学生的学号
(SELECT Sno FROM SC WHERE Cno='C01')
EXCEPT
(SELECT Sno FROM SC WHERE Cno='C02')