广告
返回顶部
首页 > 资讯 > 数据库 >Oracle exists/in和not exists/no
  • 940
分享到

Oracle exists/in和not exists/no

2024-04-02 19:04:59 940人浏览 薄情痞子
摘要

之前写过一篇关于NULL对in和not in结果的影响:oracle的where条件in/not in中包含NULL时的处理。今天来看看exists和not exists中NULL值对结果的影响。

之前写过一篇关于NULL对in和not in结果的影响:oracle的where条件in/not in中包含NULL时的处理。今天来看看exists和not exists中NULL值对结果的影响。

网上经常看到关于in和exixts、not in和not exists性能比对和互换的例子,但它们真的就可以简单互换么?我们通过下面的实验来看一下。

实验环境:Oracle 11.2.0.4

1、创建表并插入测试数据

create table t1 (id number);
create table t2 (id number);
insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);
insert into t1 values(4);
insert into t1 values(null);
commit;
insert into t2 values(3);
insert into t2 values(4);
insert into t2 values(5);
insert into t2 values(6);
commit;
zx@ORA11G>select * from t1;

	ID
----------
	 1
	 2
	 3
	 4


5 rows selected.

zx@ORA11G>select * from t2;

	ID
----------
	 3
	 4
	 5
	 6

4 rows selected.

第一种情况:exists/in的查询中不包含NULL,外层查询包含NULL

zx@ORA11G>select * from t1 where exists(select 1 from t2 where t1.id=t2.id);

	ID
----------
	 3
	 4

2 rows selected.

zx@ORA11G>select * from t1 where id in (select id from t2);

	ID
----------
	 3
	 4

2 rows selected.

从上面的查询结果看出exists和in都查到了id=2和3的两条数据。

第二种情况:not exists/not in的查询中不包含NULL,外层查询包含NULL

zx@ORA11G>select * from t1 where not exists(select 1 from t2 where t1.id=t2.id);

	ID
----------

	 1
	 2

3 rows selected.

zx@ORA11G>select * from t1 where id not in (select id from t2);

	ID
----------
	 1
	 2

2 rows selected.

从上面的结果中可以看到两个查询都查到了id=1和2这两条记录,但not exists还查到了t1表中id为NULL的行。原因是表t1中id为NULL的行exists(3,4,5,6)为False,但前面加了个not则返回结果就为True了。

第三种情况:exists/in的子查询中包含NULL,外层查询包含NULL

zx@ORA11G>insert into t2 values(null);

1 row created.

zx@ORA11G>commit;

Commit complete.

zx@ORA11G>select * from t1 where id in (select id from t2);

	ID
----------
	 3
	 4

2 rows selected.

zx@ORA11G>select * from t1 where exists(select 1 from t2 where t1.id=t2.id);

	ID
----------
	 3
	 4

2 rows selected.

从上面的结果中可以看出exist和in的结果是一致的。

第四种情况:not exists和not in的查询中包含NULL

zx@ORA11G>select * from t1 where not exists(select 1 from t2 where t1.id=t2.id);

	ID
----------

	 1
	 2

3 rows selected.

zx@ORA11G>select * from t1 where id not in (select id from t2);

no rows selected

从上面的查询结果中可以看出两个结果差异很大,not exists把id=1和2和为NULL的值都查出来了,而not in查出来的结果为空。no in结果为空的原因可以参考之前的文章,not exists的原因与第二种情况类似。

第五种情况:not in/not exists的子查询中无NULL值,外层查询也无NULL值

zx@ORA11G>delete from t1 where id is null;

1 row deleted.

zx@ORA11G>delete from t2 where id is null;

1 row deleted.

zx@ORA11G>commit;

Commit complete.

zx@ORA11G>select * from t1 where id not in (select id from t2);

	ID
----------
	 1
	 2

2 rows selected.

zx@ORA11G>select * from t1 where not exists(select 1 from t2 where t1.id=t2.id);

	ID
----------
	 1
	 2

2 rows selected.

第六种情况:in/exists的子查询中无NULL值,外层查询也无NULL值

zx@ORA11G>select * from t1 where id in (select id from t2);

	ID
----------
	 3
	 4

2 rows selected.

zx@ORA11G>select * from t1 where exists(select 1 from t2 where t1.id=t2.id);

	ID
----------
	 3
	 4

2 rows selected.

第七种情况:in/exists的子查询中有NULL值,外层查询无NULL值

zx@ORA11G>insert into t2 values(null);

1 row created.

zx@ORA11G>commit;

Commit complete.

zx@ORA11G>select * from t1 where id in (select id from t2);

	ID
----------
	 3
	 4

2 rows selected.

zx@ORA11G>select * from t1 where exists(select 1 from t2 where t1.id=t2.id);

	ID
----------
	 3
	 4

2 rows selected.

第八种情况:not in/not exists的子查询中有NULL值,外层查询无NULL值

zx@ORA11G>select * from t1 where id not in (select id from t2);

no rows selected

zx@ORA11G>select * from t1 where not exists(select 1 from t2 where t1.id=t2.id);

	ID
----------
	 1
	 2

2 rows selected.



从上面的八种情况我们可以总结如下:

    1、in和exists在有无NULL的情况下可以相互转换。

     2、not in和not exists在都没有NULL值的情况下才可以相互转换。


参考:https://mp.weixin.qq.com/s/rHKBFMQrrBf1TiUo6UmEmQ

Http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions013.htm#sqlRF52169

http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions012.htm#SQLRF52167


您可能感兴趣的文档:

--结束END--

本文标题: Oracle exists/in和not exists/no

本文链接: https://www.lsjlt.com/news/44802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle exists/in和not exists/no
    之前写过一篇关于NULL对in和not in结果的影响:Oracle的where条件in/not in中包含NULL时的处理。今天来看看exists和not exists中NULL值对结果的影响。...
    99+
    2022-10-18
  • in与exists和not in 与 not exists的区别
    in 与 exists:   外表大,用IN;内表大,用EXISTS;   原理:   用in:外表使用了索引,直接作hash连接;   用exists:内表使用...
    99+
    2022-01-25
    in与exists和not in not exists的区别
  • in, not in , exists , not exists它们有什么区别
    本篇内容介绍了“in, not in , exists , not exists它们有什么区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
    99+
    2022-10-18
  • EXISTS和NOT EXISTS介绍
    带有(NOT) EXISTS谓词的子查询 1. 基本知识介绍 1. EXISTS代表存在量词 带有EXISTS谓词的子查询不反回任何数据,值产生逻辑真值**“true”**或逻辑假值 “false”...
    99+
    2023-09-12
    mysql sql
  • oracle中的exists 和not exists 用法详解
    在Oracle中,EXISTS和NOT EXISTS是用来检查子查询是否返回任何行的条件运算符。- EXISTS:当子查询返回至少一...
    99+
    2023-09-12
    Oracle
  • IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么
    本篇文章给大家分享的是有关IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小...
    99+
    2022-10-18
  • sql中exists和not exists怎么用
    这篇文章主要介绍了sql中exists和not exists怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。exists:强调的是是否有返回集,不需知道具体返回...
    99+
    2023-06-29
  • sql中exists和not exists怎么使用
    在SQL中,EXISTS和NOT EXISTS是用来检查子查询是否返回结果的条件表达式。- EXISTS:如果子查询返回至少一行结果...
    99+
    2023-08-16
    sql
  • 把not in 改成not exists后的优化
      ...
    99+
    2022-10-18
  • 详细聊聊sql中exists和not exists用法
    目录exists:exists 和in 的区别not exists详细介绍:附案例分析总结之所以要说这个问题,是因为项目中用到了not exists,但两者写的语句只有一点差别,结果...
    99+
    2022-11-13
  • 详细聊聊sql中exists和not exists用法
    在SQL中,EXISTS和NOT EXISTS是用于判断子查询中是否存在或不存在记录的条件运算符。1. EXISTS用法:EXIST...
    99+
    2023-08-08
    SQL
  • Oracle中in和exists的区别是什么
    本篇文章给大家分享的是有关Oracle中in和exists的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、第一种情况selec&...
    99+
    2022-10-18
  • sql中not in与not exists的区别有哪些
    这篇文章主要为大家展示了“sql中not in与not exists的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“sql中not in与not ex...
    99+
    2022-10-19
  • oracle中的not exists怎么使用
    在Oracle中,NOT EXISTS是一个用于查询的条件表达式,用于检查一个子查询是否为空。如果子查询返回的结果集为空,则NOT ...
    99+
    2023-08-23
    oracle
  • in和exists的区别以及exists和distinct去重的区别?
    小编相信大家都知道in和exists的区别:1、运用情况不同sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,。sql中exist适用于外层的主查询记录较少,子查询中的表大,又有...
    99+
    2022-10-18
  • MySQL中exists和in的区别
    一、in关键字 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。 select * from A w...
    99+
    2023-09-10
    mysql sql中in exists
  • oracle中not exists的用法是什么
    在Oracle中,NOT EXISTS是一个条件运算符,用于检查子查询中是否存在记录。如果子查询返回的结果集为空,则返回True,否...
    99+
    2023-08-22
    oracle
  • MySQL中in和exists区别详解
    一、提前准备 为了大家学习方便,我在这里面建立两张表并为其添加一些数据。 一张水果表,一张供应商表。 水果表 fruits表 f_id ...
    99+
    2022-05-30
    MySQL in exists
  • sql not in与not exists使用中的细微差别是什么
    这篇文章将为大家详细讲解有关sql not in与not exists使用中的细微差别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。上面两个简单的Sq...
    99+
    2022-10-19
  • mysql中in和exists的区别是什么
    这篇文章主要介绍mysql中in和exists的区别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!exists和in的区别有:in是把外表和内表做hash连接,先查询内表;ex...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作