sql 子查询
1,一个select from where 称作为一个查询块,一个select嵌套在select,insert,update,delect语句中,称为子查询或者内存查询包含子查询则称为主查询或者外层查询。
子查询一边出现在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 WHERE Cno='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');
查询的集合运算
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')