SQL exists/not exists语句

在SQL查询语句中Exists,not Exists是比较有意思的,也是比较难理解的一个地方。下面就来总结一下这方面的内容;
以student-SC-course数据库中为代表
(1) 查询所有选修了001号课程的学生的姓名。

select Sname
from Student
where exists
(
select *
from SC
where Sno = Student.Sno AND Cno=’001’
);
分析:
1,先从student中找出第一个元组的Sno,然后进到Exists。
2,从SC表中查找是否又满足where的元组,如果有,那么where返回为真,student的第一个元组满足查询条件。
3从student选出下一个元组来,重复上述一二过程。直到student的元组找遍。
(2)查询所有没有选修了001号课程的学生的姓名。
这条查询语句在第一题的exists后面加上not就是了。即:
select Sname
from Student
where not exists
(
select *
from SC
where Sno = Student.Sno AND Cno=’001’
);
查询过程:
(1)也是从student找出一个元祖的sno出来,进入exists中
(2)假如从SC中可以找出一个元组来,满足了where后面的语句,那么就是当前这个学生选择了001课程。第一条where语句返 回就是false(使用的是not exists),那么student的这个元组就是不满足查询条件的。即:这个元组不会出现在结果查询表中。
(3)从student选择下一个元组,重复上述一二。知道student元组查询完毕。

例3:查询选修了全部课程的学生姓名。
select Sname
from Student
where not exists
(
select *
from Course
where not exists
(
select *
from SC
where Sno=Student.Sno AND
Cno=Course.Cno
) );
分析:这种语句是比较难理解的。过程是这样的:
(1)从student中选择一个元组出来,进入到第一个where中;
(2)从course中选择一个元组出来,进入到第二个where中;
(3)从SC表中查找是否有满足where的语句,假如有,就是说当前学生有选择当前课程。第二个where后面返回是false,继续 从course中选择下一个元组出来,看看是否满足第二个where后面的语句,假如又满足。第二个where后面的还是false。如果course中全部元组都遍历了一遍,说明当前学生选择了course中的全部课程。第二个where还是false,第一个where返回就是true了,这个student的元组就是满足条件的。假如第二个where返回为真,就是说明当前course的课程这个学生是没有选择的,这样第一个where就是false了,student的这个元组自然就不满足查询条件了。
(4)从student中找出下一个元组,重复(2)(3)就是。

猜你喜欢

转载自blog.csdn.net/huangchongwen/article/details/49804691