SQL 中 EXISTS 与 NOT EXISTS
带有 EXISTS 操作符的子查询不返回任何数据,只产生逻辑真值 'true' 或逻辑假值 'false'。带有 EXISTS 操作符的子查询都是相关子查询。
相关子查询:子查询的条件依赖父查询。
EXISTS:如果内层查询结果非空,则外层 WHERE 子句返回真值,输出外层查询结果。
NOT EXISTS:如果内层查询结果为空,则外层 WHERE 子句返回真值,输出外层查询结果。
样例表
create table Student (Sno ) primary key, --学号 Sname ) unique, --姓名 ); create table SC (sno ), --学号 cno ), --课程号 primary key (sno,cno), foreign key (sno) references student(sno) ); ,'CS'); ,'CS'); ,'MA'); ,'IS'); '); '); '); '); ');
/*查询至少有一门课没选的学生姓名*/ SELECT sname FROM Student WHERE EXISTS (SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno)); -- 外层要有查询结果 中层查询结果要为非空 内层查询结果要为空 = 至少有一门课没选 /*查询所有课都没选的学生姓名*/ SELECT sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno)); --外层要有查询结果 中层查询结果要为空 内层查询结果要为空 = 所有的课都没选 /*查询至少选了一门课的学生姓名*/ SELECT sname FROM Student WHERE EXISTS (SELECT * FROM Course WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno)); --外层要有查询结果 中层查询结果要为非空 内层查询结果要为非空 = 选了至少一门课 /*查询选了所有课的学生姓名*/ SELECT sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno)); --外层要有查询结果 中层查询结果要为空 内层查询结果要为非空 = 选了所有的课 /*用 GROUP BY */ SELECT sname FROM Student LEFT JOIN SC ON Student.Sno=SC.sno GROUP BY Sname HAVING COUNT(cno)<= (SELECT COUNT(cno) ; SELECT sname FROM Student LEFT JOIN SC ON Student.Sno=SC.sno GROUP BY Sname ; SELECT sname FROM Student LEFT JOIN SC ON Student.Sno=SC.sno GROUP BY Sname ; SELECT sname FROM Student LEFT JOIN SC ON Student.Sno=SC.sno GROUP BY Sname HAVING COUNT(cno)= (SELECT COUNT(cno) FROM Course);
/*查询至少选修了学生 201215122 选修的全部课程*/ SELECT DISTINCT sno FROM SC x WHERE NOT EXISTS (SELECT * FROM SC Y AND NOT EXISTS(SELECT * FROM SC Z WHERE Z.sno=X.sno AND Z.cno=Y.cno)); --外层要有查询结果 中层查询结果要为空 内层查询结果要为非空 = 至少选修了201215122 选修的全部课程 SELECT cno INTO copy FROM SC ; --复制 201215122 选的课号到 copy 表 SELECT DISTINCT sno FROM copy LEFT OUTER JOIN SC ON SC.cno=copy.cno --以 copy 表为全部行 GROUP BY sno HAVING COUNT(SC.cno)= (SELECT COUNT(cno) --排序只选了 copy 表中的一门或几门课的 sno FROM copy);
SQL 中 EXISTS 与 NOT EXISTS的更多相关文章
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别
SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别: IN:确定给定的值是否与子查询或列表中的值相匹配. IN 关键字使您得以选择与列表中的任意一个值匹配的行. 当要获得居住在 ...
- sql中 in , not in , exists , not exists效率分析
in和exists执行时,in是先执行子查询中的查询,然后再执行主查询.而exists查询它是先执行主查询,即外层表的查询,然后再执行子查询. exists 和 in 在执行时效率单从执行时间来说差不 ...
- (转)sql中 in 、not in 、exists、not exists 用法和差别
exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AI ...
- oracle中的exists 和not exists 用法 in与exists语句的效率问题
博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源( in与exi ...
- 关于sql中in 和 exists 的效率问题,in真的效率低吗
原文: http://www.cnblogs.com/AdamLee/p/5054674.html 在网上看到很多关于sql中使用in效率低的问题,于是自己做了测试来验证是否是众人说的那样. 群众: ...
- SQL中EXISTS的用法
比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FR ...
- SQL中EXISTS怎么用[转]
SQL中EXISTS怎么用 1 2 3 4 分步阅读 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤 1 EXISTS用于 ...
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- 浅谈sql中的in与not in,exists与not exists的区别
转 浅谈sql中的in与not in,exists与not exists的区别 12月12日北京OSC源创会 —— 开源技术的年终盛典 » sql exists in 1.in和exists ...
- SQL中exists的使用方法
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...
随机推荐
- 如何获取ResultSet的行数和列数
当我们执行数据库查询返回一个ResultSet的时候,很多情况下我们需要知道这个ResultSet的大小,即它的行数和列数.我们知道它的列数可以通过resultSet.getMetaData().ge ...
- c#保留小数点后位数的方法
Double dValue = 95.12345; ; string strValue = "95.12345"; string result = ""; re ...
- Java IO 操作(一)
(1)File 类的基础用法 // 1.创建 一个file 对象File file = new File("D:\\aaa");// 2.判断此 file 是否是一个文件夹file ...
- Codeforces Round #258 (Div. 2)
A - Game With Sticks 题目的意思: n个水平条,m个竖直条,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉 解题思路: 每次删除 ...
- Winform中创建超链接,点击跳转网页
代码如下: System.Diagnostics.Process ie = new System.Diagnostics.Process();ie.StartInfo.FileName = " ...
- 弄清 CSS3 的 transition 和 animation
弄清 CSS3 的 transition 和 animation transition transition 属性是 transition-property, transition-duration, ...
- 【BZOJ1857】[Scoi2010]传送带 三分法
三分套三分,挺神奇的...每次找到,每个传送带的上下两个三等分点,下面那个小,则一定有更优的在中间. #include <iostream> #include <cstdio> ...
- S3C2440UART之FIFO
一.基础知识 S3C2440有3个独立的串口,每一个都可以利用DMA和中断方式操作.每个包含2个64字节FIFO,一个收,一个发.非FIFO模式相当于FIFO模式的一个寄存器缓冲模式.每一个UART有 ...
- 国内外三个不同领域巨头分享的Redis实战经验及使用场景
Redis不是比较成熟的memcache或者Mysql的替代品,是对于大型互联网类应用在架构上很好的补充.现在有越来越多的应用也在纷纷基于Redis做架构的改造.首先简单公布一下Redis平台实际情况 ...
- SpringMVC自定义处理器里的那些事
一.如何让一个普通类成为Controller? ①:实现接口Controller 解析:handleRequest(request,response) ②:继承AbstractController 解 ...