目标代码:
SELECT SN
FROM S
WHERE (NOT EXISTS ( SELECT *
FROM C
WHERE NOT EXISTS(SELECT *
FROM SC
WHERE SNO=S.SNO AND CNO=C.CNO)))
相关子查询的执行顺序:首先查询父查询表中的第一行记录,内部的子查询利用此行中相关属性值进行查询,然后父查询根据子查询返回的结果判断此行是否满足查询条件。如果满足条件,则将该行放入父查询的查询结果集合中。重复执行这一过程,直到处理完父查询表的每一行数据。
Exists和NOT Exists:
Exists表示存在的量词,带有Exists的子查询不返回任何实际数据,他只得到逻辑值“真”和“假”。当子查询的查询结果为非空时,外层的where子句返回真值,否则返回假值。Not Exists与此相反。
目标代码解析(个人理解):
可以将该段代码理解为两层for的嵌套循环,首先父查讯一次然后再去进行where中的第一个Not Exists 中的select当他执行完一次后,就将第二个中的Not Exists的select 中的表中内容根据要求返回是否真和假,判断这一条记录是否要保存,然后继续。(该段代码是用于查询选修所有课程的学生的姓名)
for(;;s