带有(NOT) EXISTS谓词的子查询

1. 基本知识介绍

1. EXISTS代表存在量词

  1. 带有EXISTS谓词的子查询不反回任何数据,值产生逻辑真值**“true”**或逻辑假值 “false”

    使用EXISTS查询后

    1. 若内存查询结果非空,则外层的WHERE子句返回真值,否则返回假值
    2. 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名没有意义
  2. 例题

//查询所有选修了 1号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS (SELECT* FROM SC WHERE Sno = Student.Sno AND Cno='1');

2. NOT EXISTS

  1. 与EXIST谓词对应的是NOT EXISTS谓词,使用存在量词NOT EXISTS后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值
  2. 例题
//查询没有选修1号课程的学生姓名
SELECT Sname
FROM Student
WHER NOT EXISTS(SELECT* FROM SCWHERE Sno = Student.Sno AND Cno='1');

2. 进阶

  1. 一些带有EXISTS或者NOT EXISTS谓词的子查询,不可以被其他形式的子查询等价代替,但是所有带有IN谓词、比较运算符、ANY或ALL谓词的子查询都可以用带有EXISTS谓词的子查询等价替换;

  2. 例题

//查询和“刘成”在同一系学习的学生
//法1 用IN
SELECT Sname ,Sno,Sdept
FROM Student
WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname = '刘成');//法二 用EXISTS
SELECT Sname,Sno,Sdept
FROM Student S1
WHERE EXISTS(SELECT * FROM Student S2WHERE S1.Sdept=S2.Sdept AND S2.Snmae='刘成');

3. 查询选修了所有课程的学生姓名 重点例题详解

//查询选修了所有课程的学生姓名
SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT* FROM CourseWHERE NOT EXISTS(SELECT*FROM SCWHERE Sno = Student.Sno AND Cno = Course.Cno));
/*解释:
我们来先讨论以下 SELECT * FROM Table WHERE ...语句的实现
1. 选择FROM后面的表格Table,轮流Table中的每条数据,相当于指针的指向
2. 指针牵着第一条数据进入WHERE的语句中,进行筛选,如果满足条件,这个数据就被选了出来
3. 第一条筛选结束,指针向下移,指向第二条数据;指针再牵着第二条数据进入WHERE中筛选,如果满足条件,这个数据就被选了出来
4. 一直这样操作,直至指针牵完Table中的数据
我们再来解释一下这个题,它涉及三个表Student,SC,Course
以下是其操作流程
1. 小1指针指向Student表中的第一条数据小2指针指向Course表中的第一条数据小3指针指向SC表中的第一条数据小指针们准备就绪...
2. 假如有个人叫张三,他将Couse表中的所有课都选了小1指针正指着Student表中这个张三的数据小2指针依旧指向Couse表中的第一个数据小3指针指向SC表中的第一条数据小3指针牵着第一条数据,依照 Sno = Student.Sno AND Cno = Course.Cno  这个筛选条件,进行筛选;将SC表遍历完之后,肯定会有一个非空的值,返回到最内层的SELECT表中,因为肯定会在SC表中找到小2所指的课程,且这个人叫张三,但是在返回的时候遇到 NOT EXISTS谓词,因为非空,则 NOT EXISTS一定返回 false,即淘汰小2指针所指的这个课程小2再指向下一个课,小3再遍历,重复以上,直至小2将表中的课全遍历完毕....经过以上的循环,最终经过第二个 NOT EXISTS ,第二句中的 SELECT 并没有选出一个数据,因为所有的课程都被淘汰了,所以为空则第二层的*/SELECT* FROM CourseWHERE NOT EXISTS
//等价于SELECT* FROM CourseWHERE false
/*则啥都不选,返回一个空表,而在出最外层括号时,又见 NOT EXISTS 返回 true;所以就成功筛选小1指针所指的张三因为张三全选了Course中的课,所以肯定回建立一个非空的表,返回到最内层的SELECT表中
3. 再假如有个人叫做李四,他只选了Course表中的两门课,总共有5门课程,他选了前两门有了张三的基础,我们很容易得出:1. 李四选的两门课被最里面的 NOT EXISTS给淘汰掉了,2. 而其它三门,由于SC表中没有记录,当再出最里边的 NOT EXISTS 时候,SELECT返回的是空,则最里边的 NOT EXISTS返回 true,即李四没有选的课被中间的 SELECT 语句给选了出来,3. 遇到最外层的 NOT EXISTS时,由于中间的 SELECT选出来了3个记录,即为非空表,则外边的 NOT EXISTS返回 false,淘汰指针1所指的李四*/

EXISTS和NOT EXISTS介绍相关推荐

  1. mysql not exists 用法_mysql 子查询 exists 和 not exists使用方法和实例

    MySQL EXISTS 和 NOT EXISTS 介绍 SELECT ... FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查询中做条 ...

  2. 1.oracle中的exists 和not exists 用法:

    1.oracle中的exists 和not exists 用法: exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 ...

  3. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  4. [20180808]exists and not exists.txt

    [20180808]exists and not exists.txt --//生产系统遇到的一个性能问题,通过例子来说明: 1.环境: SCOTT@test01p> @ ver1 PORT_S ...

  5. sql中 in 、not in 、exists、not exists 用法和差别

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

  6. 关于T-SQL中exists或者not exists子查询的“伪优化”的做法

    问题起源 在使用t-sql中的exists(或者not exists)子查询的时候,不知道什么时候开始,发现一小部分人存在一种"伪优化"的一些做法, 并且向不明真相的群众传递这一种 ...

  7. mysql exists依赖查询_MySQL EXISTS 和 NOT EXISTS 子查询

    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: 1 SELECT ... FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据, ...

  8. oracle数据库or exists,Oracle Not Exists运算符

    本篇文章帮大家学习Oracle Not Exists运算符,包含了Oracle Not Exists运算符使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 在本教程中,您将 ...

  9. 真正理解exists 和not exists

    前言 今天看了下mysql训练题,其中有一题很有意思. ​     下面也写了sql解答,使用了group_concat()函数,这个函数是分组后将一组的字段(比如name)拼接在一起,默认以逗号分隔 ...

最新文章

  1. 马尔科夫、最大熵、条件随机场
  2. java set path_Java Path.setEffect方法代码示例
  3. 过滤html标签的代码
  4. 安卓加载asset中的json文件_Android解析Asset目录下的json文件
  5. 程序一启动检查网络,如果没有网络就退出程序
  6. 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩Java开源B/S的教训(三)...
  7. 【等价变换】—— 指数对数函数
  8. Storm 实战:构建大数据实时计算
  9. echarts横向柱状图
  10. 使用命令行连接MySQL数据库
  11. android 签到自定义,Android日历签到,超级简单的实现方式
  12. 最小采样频率计算公式_【白皮书】多路复用和采样理论
  13. Olympic Class Ships【奥林匹克级邮轮】
  14. 关于心跳 Heartbeat
  15. 自动驾驶中的模型预测控制(Model Predictive Control)
  16. React学习总结(一)
  17. Summers Crafts Broad Role in Reshaping Economy
  18. Tensorrtx+yolov5+windows10+vs2015+cuda11.1关键问题及步骤记录
  19. 《逆袭进大厂》之C++提高篇79问79答
  20. 正反馈、负反馈、电容器偶合、直偶、偏置

热门文章

  1. SpringCloud学习之路
  2. 无锡室内设计的四种风格
  3. cursor css(鼠标悬浮禁用) 网页制作CSS中的光标类型
  4. C++入门泛型编程介绍
  5. 小程序电话号码邮政编码正则验证
  6. Git创建本地分支并拉取远程分支
  7. 二、Git安装与配置
  8. windows服务器版本信息泄露,驱动泄密事件!Windows Server 10曝光
  9. 识别项目风险的7种方法
  10. FREERADIUS.net has a little FUCK