之所以要说这个问题,是因为项目中用到了not exists,但两者写的语句只有一点差别,结果一个有问题了,一个没问题。具体问题下面详细说明,先来看看exists如何应用。

exists:

强调的是是否有返回集,不需知道具体返回的是什么,比如:

  1. SELECT
  2. *
  3. FROM
  4. customer
  5. WHERE
  6. not EXISTS (
  7. SELECT
  8. 0
  9. FROM
  10. customer_goods
  11. WHERE
  12. customer_id = 1
  13. )

只要exists引导的子句有结果集返回,这个条件就算成立。这个返回的字段始终是0,改成1,则始终返回的是1,所以exists不

在乎返回的是什么内容,只在乎是否有结果集返回。

exists 和in 的区别

这二者最大的区别,是使用in只能返回一个字段值

  1. SELECT
  2. *
  3. FROM
  4. customer c
  5. WHERE
  6. c.id
  7. not in (
  8. SELECT
  9. customer_id
  10. FROM
  11. customer_goods
  12. WHERE
  13. customer_id = 1
  14. )

但exists允许返回多个字段。

not in 和not exists 分别为in 和exists的对立面。

exists(sql 返回结果集为真)

not exists(sql 不返回结果集为真)

not exists详细介绍:

表customer:

表customer_goods:

二者的干系:customer_goods.customer_id = customer.id

(1) 查询:

  1. SELECT
  2. *
  3. FROM
  4. customer c
  5. WHERE
  6. NOT EXISTS (
  7. SELECT
  8. *
  9. FROM
  10. customer_goods cg
  11. WHERE
  12. cg.customer_id =1
  13. )

结果:

无返回结果

(2)查询:

  1. SELECT
  2. *
  3. FROM
  4. customer c
  5. WHERE
  6. NOT EXISTS (
  7. SELECT
  8. *
  9. FROM
  10. customer_goods cg
  11. WHERE
  12. c.id =1
  13. )

结果:

(3)分析:

发现二者差别只是是否not exists字句查询的查询条件是否跟外面查询条件有关,如果not exists子查询只有自己本身的查询条件,这样只要子查询中有数据返回,就证明是false,结果在整体执行就无返回值;一旦跟外面的查询关联上,就能准确查出数据。

而我遇到的问题正是这个。

经过分析,我认为一旦跟外层查询关联上,就会扫描外面查询的表。而没一旦二者不添加关联关系,只会根据not exists返回是否有结果集来判断,这也是为什么一旦子查询有数据,就查不到所有的数据了。

exists和no exists 在sql中的区别相关推荐

  1. java中exists是什么_JAVA:sql中exists的用法

    exists:强调的是是否返回结果集,不要求知道返回什么,比如:selectnamefromstudentwheresex='m'andmarkexists(select1fromgradewhere ...

  2. 选择Data类型在Access与Sql中的区别

    今天编写一个查询语句,其中需要比较日期,系统总是提示数据类型不匹配,经查才发现 在Access查询日期时,需加上#号做为标识 在SQL查询日期时,需加上'号做为标识 select * from sim ...

  3. SQL中IN与EXISTS的比较

    为什么80%的码农都做不了架构师?>>>    由于要使用 in,后来在网上找找了,发现有如下文章,大家共享一下.一起进步啦. 使用in的话,如果存在索引,和使用 join 性能差别 ...

  4. Oralce 使用SQL中的exists 和not exists 用法详解

    exists表示() 内子查询返回结果不为空,说明where条件成立就会执行sql语句:如果为空,表示where条件不成立,sql语句就不会执行. not exists和  exists相反,子查询语 ...

  5. sql中exists替换in的区别

    在sql中使用exists替换in查询时要注意使用exists时一定要关联主查询和子查询的关联不然查询会得不到相应的结果如下语句:  语句一使用in查询:  select realname from ...

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

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

  7. 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 ...

  8. SQL中的Exists 用法解释

    exists的实例解析 现有两个表 a: b: 现有sql语句如下 select * from a where exists (select 1 from b where b.b_id = a.id) ...

  9. 关于SQL中not exists的双重否定的一些记录

    作者:kuikui 关于SQL中not exists的双重否定的一些记录 室友在学习数据库时遇到了not exists双重否定的一些问题 在csdn上学习大佬们的理解办法 借此机会回顾一下 eg.表结 ...

  10. 你真的了解SQL中的EXISTS谓词吗?

    EXISTS 谓词的用法 支撑 SQL 和关系数据库的基础理论主要有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是"一阶 ...

最新文章

  1. 突破电信3G宽带对网页浏览的上网限制
  2. 一起学设计模式 - 责任链模式
  3. 2018年08月19日发烧诸事记
  4. MySQL查询本年的数据的sql语句
  5. 字节跳动最新开源!java界面实现查询功能
  6. 几个以前项目中使用的函数 (转)
  7. AtCoder Grand Contest 021 D - Reversed LCS(区间dp)
  8. TiDB数据库备份恢复与数据迁移
  9. 深度学习知识抽取:属性词、品牌词、物品词
  10. PPT好帮手,模版不用愁-www.officeplus.cn
  11. 爱豆被“调包”?周杰伦:说好不哭
  12. OutMan——Foundation框架中的常用结构体、NSNumber类和NSValue类
  13. 协同控制中的共识算法概述
  14. ASAN和HWASAN原理解析
  15. python毕业设计项目源码选题(10)电影院售票系统毕业设计毕设作品开题报告开题答辩PPT
  16. linux启动zabbix服务,zabbix监控Linux系统服务的流程
  17. S7-200SMART PLC中书签和交叉引用的具体使用方法示例
  18. dell蓝牙图标消失,不能用
  19. 神武3服务器神武币交易中心,《神武3》电脑版:神武币使用方向攻略,神武币如何花在刀刃上...
  20. 通用寄存器介绍和段寄存器的介绍

热门文章

  1. 如何获取股票交易接口
  2. 中国大学慕课mooc答题/自动播放脚本(domooc)使用教程
  3. 考研面试php,考研复试 | 盘点:这些院校已公布2019考研复试内容
  4. blob/text column 'content' used in key specification without a key length
  5. MySQL binlog时间异常分析
  6. 交响曲、协奏曲、奏鸣曲
  7. 【CSS】笔记4-浮动、切图、学成在线
  8. STM32控制TFTLCD显示屏(理论)
  9. 解决idea项目中没有蓝色方块
  10. 理解Vulkan中的各种对象