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)就是。
以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中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- sql 存储过程分页
- 在WINXP系统上安装SQL Server企业版的方法
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- PostgreSQL教程(十九):SQL语言函数
- SQL Server复制需要有实际的服务器名称才能连接到服务器
- SQL Server 2000向SQL Server 2008 R2推送数据图文教程