前置:https://blog.csdn.net/Jaihk662/article/details/80144010

注:所有的下划线+斜体语句都是非必须语句

在提到exist之前,先再看看 in 语句:

现有两张表:第一张是学生信息(infer),第二张是学生选课及成绩(sc)

执行语句如下:

select * from infer
where st in (select st from scwhere sc.st = infer.st and sc.ct = '003');

检索选修了003号课程的学生的信息

其中 in 语句的具体过程如下:

步骤①:先执行子查询,求出所有的满足条件的学号映射如下:

步骤②:将子查询得到的学号映射作为一个table,与原有的学生信息(infer)表进行笛卡尔积,结果如下:

步骤③:再从中挑出所有满足 infer.st = sc.st 条件的元组(图片中深蓝色的两条)

从上面具体步骤可以看出,通俗来讲in语句的复杂度大概是O(n*m)的,其中n为外表(infer)大小,m为内表(sc)大小

再说 exists 子查询:

SQL语句:not exists (子查询)

语言描述:对于每一个元组,检查满足子查询条件的元组存不存在,如果存在就返回1,否则返回0

还是上面那张表,还是那个例子(检索选修了003号课程的学生的信息):

select * from infer
where exists (select * from scwhere sc.st = infer.st and sc.ct = '003');

当然,这个语句和上面的那个 in 语句起到的效果一模一样

但是它们的步骤却不同,exists语句具体过程如下:

步骤①:先查外层的表(infer):

步骤②:暴力外层表中的每一个元组,执行子查询中的语句,判断满足要求的元组是否存在

步骤③:如果存在返回1,否则返回0,如果返回的是1的话,则该行结果保留,如果返回的是0的话,删除该行

从上面具体步骤可以看出,整个过程就是exists执行了infer.size()次

总结:和 in 语句相比,它们的作用其实一样,但它们的具体步骤不一样

当内表(sc)比外表(infer)大很多时,使用 exists 语句要更优,反之使用 in 语句更优

not exists 简要介绍:

很容易理解,就是和exists相反,如果不存在返回1,否则返回0,但是 not exists 却可以实现很多新功能

例如:检索学过001号教师主讲的所有课程的所有同学的姓名

Select Sname From Student
Where not exists (Select * From Course
Where Course.Tc = ‘001’ and not exists (Select * From SC
Where St = Student.St and Ct = Course.Ct)); 

语言描述:不存在有一门001号教师主讲的课程该同学没学过

[not] exists 和 in相关推荐

  1. MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)

    1. 子查询概念 子查询是指嵌套在其他语句(SELECT . INSERT . UPDATE . DELETE 等)中的 SELECT 语句:子查询也称为内查询( inner query )或者嵌套查 ...

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

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

  3. SQL:EXISTS的用法理解(转)

    摘自:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c. ...

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

    有两个简单例子,以说明 "exists"和"in"的效率问题 1) select * from T1 where exists(select 1 from T2 ...

  5. SQL with NUll处理,Join系列,between,in对比exists以及少量题目

    2019独角兽企业重金招聘Python工程师标准>>> 1.一些题目: 选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜) Selecta,b,c fr ...

  6. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  7. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....

    Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 解决办法一:保 ...

  8. oracle exists mysql_oracle_in_exists_left-join

    查询A表中的数据没有出现在B表中 mysql> select * from user; +------+-------+ | uid  | uname | +------+-------+ |  ...

  9. oracle exists语句

    前言 书上这么写的,先看from,再看where,最后选出满足的行 select * from A where exists (select * from A where Code=1111) 等同于 ...

  10. sql中exists,not exists的用法

    exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:   select name from student where sex = 'm' and mark exists(selec ...

最新文章

  1. python语法知识_Python基础语法知识汇总(学习党的最爱!)
  2. 秒拨动态ip切换技术python_Python爬虫如何通过更换IP避开网站的反爬虫机制(一)...
  3. Rsync数据同步服务
  4. c# 说说开发通用通信库,尤其是分布式服务的通信
  5. http协议网络编程
  6. 你要知道的开源地理空间软件10件事
  7. Java调优:Mybaitis的缓存优化
  8. php模板技术 实例
  9. php基础教程(二):基础语法
  10. JAVA基础--继承(inheritance)
  11. Java集合里面的值唯一_java 判断集合元素唯一的原理
  12. VASSISTX在vs里面应用的快捷键
  13. csdn编辑器公式中插入空格
  14. 什么是卡诺图,如何用卡诺图表示逻辑函数,如何用卡诺图化简逻辑函数
  15. 再次哀悼吧!最佳夸浏览器同步 Xmarks 宣布终止服务
  16. java编译程序包不存在_在cmd下编译Java源文件文件出现程序包xxxx不存在
  17. Pixel2Mesh从单个RGB图像生成三维网格ECCV2018
  18. FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换
  19. 【kettle】【报错】 Unexpected problem reading shared objects from XML file 当读共享文件时发生错误
  20. DNS解析常见问题:如何添加A记录?

热门文章

  1. python贴吧-Python爬虫——抓取贴吧帖子
  2. python系统下载-python
  3. python3入门经典100例-Python3入门机器学习_经典算法与应用-慕课网实战
  4. python兼职程序员工资-没想到,学会Python即使不做程序员都能月入过万!
  5. 零基础适合学python吗-零基础,经济学专业,适合自学Python吗?
  6. python编程入门书籍-编程小白的第一本 Python 入门书
  7. android alphaanimation xml,android AlphaAnimation动画代码实现与XML实现
  8. 前端emojs_Emoji-Chat emoji表情包发送及显示兼容web端、移动端
  9. vue elementui表单清空前一次的数据
  10. MySQL 用gourp by分组后取某一字段最大值