exists(sql 返回结果集为真,即有值)
not exists (sql 不返回结果集为真,即为空)
如下:
表A
ID NAME
1 A1
2 A2
3 A3
表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表A和表B是1对多的关系 A.ID => B.AID
SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
1 A1
2 A2
原因可以按照如下分析
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据
NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
3 A3
===========================================================================
EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)
NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)
如果in和not in的子集中不存在NULL的值,但in和not in的合集则为全部数据
若not in的子集中存在有null值,则会查找不到数据的,结果为空。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select deptno
2 from dept
3 where deptno in (10,50,null);
DEPTNO
----------
10
//看到使用in的时候即便有null 也是正常的 下面看一下not in
SQL> select deptno
2 from dept
3 where deptno not in (10,50);
DEPTNO
----------
20
30
40
//这里看起来和我们的预期挺符合的哦
SQL> select deptno
2 from dept
3 where deptno not in (10,50,null);
no rows selected
//怎么回事 为什么加了个null 前面的20、30、40三条数据就不显示出来了
IN和NOT IN本质上都是OR运算,因而计算逻辑OR时处理NULL的方式不同,产生的结果也不同。
下面我们分析一下前面的三条语句
SQL> select deptno
2 from dept
3 where deptno in (10,50,null);
这里可以等价于where deptno=10 or deptno=50 or deptno=null,由于是or相连接,那么只要有一个条件为TRUE,整个就喂TRUE了。所以deptno为10的记录显示出来了。
SQL> select deptno
2 from dept
3 where deptno not in (10,50,null);
这里等价于where not (deptno=10 or deptno=50 or deptno=null),拿deptno=20的记录来举例吧。
not (20=10 or 20=50 or 20=null)
not(false or false or null)
not null
null
(以前只知道在where条件返回false的时候不成立,现在看来返回NULL的时候也不成立呀,下面是做的一个小实验可以证明这个猜想)
#####################
SQL> select * from dept
2 where 1=null;
no rows selected
#####################
SQL> select deptno
2 from dept
3 where deptno not in (10,50);
这里等价于where not (deptno=10 or deptno=50),依然拿deptno=20来举例。
not (20=10 or 20=50 )
not(false or false)
not false
true
注意:FALSE OR NULL=NULL ,而TRUE OR NULL=TRUE。
相关推荐
在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...
IN、EXISTS、NOT EXISTS、NOT IN 在 SQL 语句中的应用和区别 IN 语句和 EXISTS 语句都是 SQL 语句中用来判断是否存在某个值的语句,但是它们的实现机制和应用场景是不同的。 IN 语句是通过 hash 连接来实现的,它...
SQL 中 IN、EXISTS、NOT IN、NOT EXISTS 的区别 IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,...
JAVA使用ElasticSearch查询in和not in的实现方式 Elasticsearch是一个基于Lucene的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。它是用Java开发的,并作为Apache许可条款下的开放...
SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...
### 经典SQL查询总结关于Exists, not Exists, IN, not IN 效率的说明 在数据库查询操作中,存在着多种方法来实现相似的功能,但不同的实现方式在性能上可能会有显著差异。本文将深入探讨 SQL 中 `EXISTS`, `NOT ...
在处理大量数据时,尤其需要注意避免使用效率较低的操作符,如`IN`和`NOT IN`。这些操作符虽然在编写时提供了简洁和易读性,但在执行效率上往往不如其他替代方法。本文将深入探讨`IN`和`NOT IN`的替代方案,并通过...
摘要:Delphi源码,数据库应用,查询实例 Delphi使用in或notin限制查询范围实例,数据查询方面的例子,分享给Dlephi学习者。附有SQL的数据库文件。 运行环境:Windows/Delphi7
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句.txt欢迎下载!
在SQL查询语言中,`NOT EXISTS`、`NOT IN` 和 `NOT NULL` 是三种用于排除特定条件的数据记录的方法。然而,在实际应用中,这三种语法有着不同的应用场景和执行逻辑,有时初学者可能会误以为它们是等效的,但实际上...
用sudo时提示"xxx is not in the sudoers file. This incident will be reported.其中XXX是你的用户名,也就是你的用户名没有权限使用sudo,我们只要修改一下/etc/sudoers文件就行了。
### Relocation Value Does Not Fit in 24 Bits:由来及对策 #### 一、问题背景与概述 在使用VxWorks系统时,用户在处理PowerPC架构下的代码时经常会遇到一个错误:“Relocation value does not fit in 24 bits”...
Name salesDataSource is not bound in this Context,连接池的问题
Fatal error: Class ‘COM’ not found in XXXXXXXXX 没发现 COM 类,php代码主要是调用一些系统的信息,初想应该是php没配置好,在stackoverflow找到答案,是讨论xampp的,要延伸开来,我加了几个要点: ★ php 根...
Allegro中导入orCAD原理图网络表时,出现以下错误: “Symbol 'BP' for device 'BEEP_BP_BEEP' not found in PSMPATH or must be "dbdoctor"ed”
在这个问题中,开发者遇到了一个常见的错误:“Name jdbc is not bound in this Context”,这通常意味着在Tomcat的环境中,指定的数据源没有被正确地绑定或配置。 要解决这个问题,首先需要在Tomcat的配置文件中...
"SQL中对not in和not exist查询的替代算法.pdf" 本文主要讨论了SQL中对not in和not exist查询的替代算法。首先,作者简要介绍了SQL语言的基本概念和特点,然后讨论了not in和not exist查询的低效性及其原因。接着,...
Window系统无法调用OpenCV代码报错:java.lang.UnsatisfiedLinkError: Directory separator should not appear in library name: C:\Windows\System32\opencv_java343.dll。出现该问题主要是安装的Windows系统缺乏...
解决 exec: "gcc": executable file not found in %PATH%,被墙了,搭梯下的,解压后直接配置 %path% 路径即可,亲测可用。
在Code::Blocks中遇到“'to_string' was not declared in this scope”的错误,通常是由于编译器版本过低或者没有包含正确的头文件所导致的。`std::to_string`是C++11标准引入的一个函数,用于将数字转换为字符串。...