1.简介
2.表结构选课表:学号、课程号 学生表:学号、姓名 课程表:课程号、课程名 3.查询所有选修了“C1”课程的学生名。普通SQL查询:SELECT 姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1'); 带EXISTS的SQL查询:SELECT 姓名 FROM 学生表 WHERE EXISTS ( SELECT * FROM 选课表 WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1' ); 相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。 EXISTS语句不关心子查询的具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。
4.查询没有选C1课程的学生的学号、姓名SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( SELECT * FROM 选课表 WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1' ); 5.查询选修了所有课程的学生的姓名(续)SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( SELECT * FROM 课程表 WHERE NOT EXISTS ( SELECT * FROM 选课表 WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号 ) ); 6.查询至少选修了S1所选的全部课程的学生名SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( SELECT * FROM 选课表 AS 选课表X WHERE 选课表X.学号='s1' AND NOT EXISTS ( SELECT * FROM 选课表 AS 选课表Y WHERE 学生表.学号 = 选课表Y.学号 AND 选课表X.课程号 = 选课表Y.课程号 ) ); 7.在FROM语句中使用子查询,对查询结果定义表名及列名 例:求平均成绩超过80分的学号及平均成绩SELECT 学号, AVG_G FROM ( SELECT 学号, AVG(Grade) FROM 选课表 GROUP BY 学号 ) AS RA(学号, AVG_G) WHERE AVG_G > 80 |
|
来自: liang1234_ > 《数据库》