您的位置:首页 > 数据库

SQL exists/not exists语句

2015-11-12 21:06 330 查看
在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)就是。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql select