带有 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的更多相关文章

  1. SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别

    SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别: IN:确定给定的值是否与子查询或列表中的值相匹配. IN 关键字使您得以选择与列表中的任意一个值匹配的行. 当要获得居住在 ...

  2. sql中 in , not in , exists , not exists效率分析

    in和exists执行时,in是先执行子查询中的查询,然后再执行主查询.而exists查询它是先执行主查询,即外层表的查询,然后再执行子查询. exists 和 in 在执行时效率单从执行时间来说差不 ...

  3. (转)sql中 in 、not in 、exists、not exists 用法和差别

    exists (sql 返回结果集为真)  not exists (sql 不返回结果集为真)  如下:  表A  ID NAME  1    A1  2    A2  3  A3 表B  ID AI ...

  4. oracle中的exists 和not exists 用法 in与exists语句的效率问题

    博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源(  in与exi ...

  5. 关于sql中in 和 exists 的效率问题,in真的效率低吗

    原文: http://www.cnblogs.com/AdamLee/p/5054674.html 在网上看到很多关于sql中使用in效率低的问题,于是自己做了测试来验证是否是众人说的那样. 群众: ...

  6. SQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FR ...

  7. SQL中EXISTS怎么用[转]

    SQL中EXISTS怎么用 1 2 3 4 分步阅读 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤 1 EXISTS用于 ...

  8. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  9. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  10. SQL中exists的使用方法

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...

随机推荐

  1. Vue - 实例

    1.实例属性介绍如下图所示: 具体介绍如下: A.$parent:访问当前组件的父实例 B.$root:访问当前组件的根实例,要是没有的话,则是自己本身 C.$children:访问当前组件实例的直接 ...

  2. byobu相关操作

    http://lingbjxm.iteye.com/blog/2155833 重命名窗口:Fn F8

  3. 识别快递单号(2) - 加载图片到canvas

    传送门: 识别快递单号(1) - 图像处理   转载请注明出处: http://www.cnblogs.com/zaiyuzhong/p/load-image-to-canvas.html 上篇说到我 ...

  4. Exchange超级实用命令行

    发现Powershell很强大以后,就欲罢不能了.来点干货

  5. ADO.NET-SqlHelper

    class Sqlhelper { //数据库连接字符 private static string connstr = ConfigurationManager.ConnectionStrings[& ...

  6. #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #endif

    情况1:#ifdef _DEBUGvirtual void AssertValid() const;                 //assert(断言)valid(有效的,正确的)virtual ...

  7. (转)windows系统下Python环境的搭建

    原博文地址:http://www.cnblogs.com/windinsky/archive/2012/09/20/2695520.html 这段时间在做python,觉得这个配置环境的帖子还不错,分 ...

  8. django 在字符串[str(list)]中精确查找

    1.问题描述 1.1表结构 1.2问题 ref_list为id列表的字符串,需要从ref_list中找出包含指定id的数据(eg id=8).如果实用models.objects.filter(ref ...

  9. SQL基本语句汇总

    语句:CREATE TABLE 作用:创建表格 格式:CREATE TABLE tableName (columnName1 columnDataType1, columnName2 columnDa ...

  10. python安装完毕后,提示找不到ssl模块的解决步骤

    转载自 醇酒醉影 python安装完毕后,提示找不到ssl模块: [root@localhost ~]# python2.7.5 Python 2.7.5 (default, Jun 3 2013, ...