SQL语句基础-子查询

子查询

在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='计算机系'UNIONSELECT *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')

猜你喜欢

转载自blog.csdn.net/livovil/article/details/93754451