首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL中EXISTS和IN的区别?

在 SQL 中,EXISTS 和 IN 是两种用于过滤查询结果的子查询方法。它们的主要区别在于处理空值和执行效率上。

  1. 空值处理:
  • IN:如果子查询返回任何空值,IN 会将其视为未知值,并且不会将其作为匹配条件。
  • EXISTS:如果子查询返回任何空值,EXISTS 会将其视为匹配条件,并且继续执行查询。
  1. 执行效率:
  • IN:当子查询返回的结果集较大时,IN 的执行效率较低,因为它需要处理更多的数据。
  • EXISTS:当子查询返回的结果集较大时,EXISTS 的执行效率较高,因为它只需要找到一个匹配的记录,然后就停止查找。

以下是一个简单的示例,说明了 EXISTS 和 IN 的用法:

代码语言:sql
复制
-- 使用 EXISTS
SELECT *
FROM orders o
WHERE EXISTS (SELECT 1
              FROM customers c
              WHERE c.customer_id = o.customer_id);

-- 使用 IN
SELECT *
FROM orders o
WHERE o.customer_id IN (SELECT customer_id
                         FROM customers);

在这个示例中,我们从 "orders" 表中选择所有与 "customers" 表中存在的客户相关的订单。使用 EXISTS 和 IN 都可以实现这个目标,但它们的处理方式和效率不同。

总之,EXISTS 和 IN 都是 SQL 中的有用工具,可以帮助您过滤查询结果。具体选择哪种方法取决于您的需求和数据结构。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据库 SQLINEXISTS用法区别

in: in是把外表内表做hash连接,先查询内表,再把内表结果与外表匹配,他是先将数据督导内存,然后取与外表匹配。...他要执行次数是外表长度*内表结果长度 exists: exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表查询使用索引,他只需要执行次数是外表长度...-------------------------- select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表所有...id字段并缓存起来.之后,检查A表id是否与B表id相等,如果相等则将A表记录加入结果集中,直到遍历完A表所有记录....如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表id是否与B表id相等.

1.2K30

SQLin与not in、exists与not exists区别以及性能分析

1、inexists in是把外表内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高说法是不准确。...end if end loop 对于in exists性能区别: 如果子查询得出结果集记录较少,主查询表较大且又有索引时应该用in,反之如果外层主查询记录较少,子查询表大,又有索引时使用...例如下面语句,看他们区别: select x,y from t; 查询xy数据如下: x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 使用not...所以要具体需求来决定 对于not in not exists性能区别: not in 只有当子查询,select 关键字后字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表记录少,子查询表记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本应用较好

2.5K20
  • SQL in与not in、exists与not exists区别以及性能分析

    1、in exists in是把外表内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高说法是不准确。...end if  end loop  对于in exists性能区别 ---- 如果子查询得出结果集记录较少,主查询表较大且又有索引时应该用in,反之如果外层主查询记录较少,子查询表大...例如下面语句,看他们区别: select x,y from t;  查询xy数据如下: x y  ------ ------  1 3  3 1  1 2  1 1  3 1  5  使用not in...对于not in not exists性能区别: not in 只有当子查询,select 关键字后字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询表小但是记录多...如果主查询表记录少,子查询表记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本应用较好

    1.9K00

    SQLin与not in、exists与not exists区别以及性能分析

    1、inexists in是把外表内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高说法是不准确。...end if end loop 对于in exists性能区别: 如果子查询得出结果集记录较少,主查询表较大且又有索引时应该用in,反之如果外层主查询记录较少,子查询表大,又有索引时使用...例如下面语句,看他们区别: select x,y from t; 查询xy数据如下: x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 使用not...所以要具体需求来决定 对于not in not exists性能区别: not in 只有当子查询,select 关键字后字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表记录少,子查询表记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本应用较好

    3.7K20

    SQLin与not in、exists与not exists区别以及性能分析

    1、inexists in是把外表内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高说法是不准确。...end if end loop 对于in exists性能区别: 如果子查询得出结果集记录较少,主查询表较大且又有索引时应该用in,反之如果外层主查询记录较少,子查询表大,又有索引时使用...例如下面语句,看他们区别: select x,y from t; 查询xy数据如下: x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 使用not...所以要具体需求来决定 对于not in not exists性能区别: not in 只有当子查询,select 关键字后字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大...如果主查询表记录少,子查询表记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本应用较好

    58230

    SQL 子查询 EXISTS NOT EXISTS

    MySQL EXISTS NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询数据,放到子查询做条件验证...当上面的 SQL 使用 NOT EXISTS 时,查询结果就是 article 表 uid 不存在于 user 表数据记录。...(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno) ); 这个算是一个比较复杂sql语句了,两个EXISTS三个WHERE...,则内层NOT EXISTS为假, 然后继续对course表下一条记录进行判断,返现NOT EXISTS值也为假,直到遍历完course表所有的数据,内层NOT EXISTS值一直都是假...下面是我自己对这段sql解读: 先取一条student记录,进入中层,再取一条course记录,进入内层,此时student记录course记录,作为内层判断条件,比如此时我取第一条记录是

    4.1K50

    SQLEXISTS使用

    相关子查询:子查询查询条件依赖于外层父查询某个属性值称为相关子查询,带EXISTS 子查询就是相关子查询 EXISTS表示存在量词:带有EXISTS子查询不返回任何记录数据,只返回逻辑值“True...普通SQL查询: SELECT 姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1'); 带EXISTSSQL查询: SELECT...); 相关子查询执行过程:先在外层查询取“学生表”第一行记录,用该记录相关属性值(在内层WHERE子句中给定)处理内层查询,若外层WHERE子句返回“TRUE”值,则这条记录放入结果表。...然后再取下一行记录;重复上述过程直到外层表记录全部遍历一次为止。 EXISTS语句不关心子查询具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。...Exists:若子查询结果集非空时,返回“True”;若子查询结果集为空时,返回“False” 。

    1.1K10

    Sql 语句中 IN EXISTS 区别及应用「建议收藏」

    最后,得到符合条件数据。 EXISTS语句:执行student.length次 指定一个子查询,检测行存在。遍历循环外表,然后看外表记录有没有内表数据一样。...区别及应用场景     in exists区别: 如果子查询得出结果集记录较少,主查询表较大且又有索引时应该用in, 反之如果外层主查询记录较少,子查询表大,又有索引时使用exists...如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表id是否与B表id相等....比较使用 EXISTS IN 查询。注意两个查询返回相同结果。...比较使用 EXISTS = ANY 查询。注意两个查询返回相同结果。

    92030

    SQL EXISTS 用法详解

    EXISTS 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。或许你一直认为 EXISTS 比 IN 语句效率要高,这种说法是不准确。 那到底该如何选择呢?...如果查询两个表大小相当,那么用 EXISTS IN 差别不大 如果两个表中一个较小,一个是大表,则子查询表大EXISTS,子查询表小用 IN 来看两个示例,假设 表 t1 为小表,表 t2...where exists(select id from t1 where id=t2.id) //效率低,用到了 t1 表上 id 列索引。...上述示例,在大表查询中使用了索引用法效率更高。 NOT EXISTS 就像 EXIST 可以用来替换 IN 一样, NOT IN 也可以用 NOT EXIST来替换。...如果查询语句使用了 NOT IN 那么内外表都进行全表扫描,没有用到索引;而 NOT EXISTS 子查询依然能用到表上索引。

    17.1K21

    SQL优化——INEXISTS效率更高

    INEXISTS被频繁使用在SQL,虽然作用是一样,但是在使用效率谁更高这点上众说纷纭。下面我们就通过一组测试来看,在不同场景下,使用哪个效率更高。...从两次测试来看,并不能说明谁效率更高,而应该具体情况具体分析: 首先来看INEXISTS执行原理: IN是做外表内表通过Hash连接,先查询子表,再查询主表,不管子查询是否有数据,都对子查询进行全部匹配...原理 exists()执行过程,并没有对每一条内表数据都进行查询,而是存在该条数据时候会将结果集存起来,到最后时候同一输出结果集。...A表有10000条记录,B表有1000000条记录, 那么exists()会执行10000次去判断A表id是否与B表id相等。...# 总结 # 1、IN查询在内部表外部表上都可以使用到索引; 2、EXISTS查询仅内部表上可以使用到索引,外表会全表扫描;当子查询结果集很大,而外部表较小时候,EXISTSBlock Nested

    5.5K30

    MySQL(七)|MySQLIn与Exists区别(1)

    t2 WHERE t1.task_id = t2.id); 这里涉及到INEXISTS区别。...select * from user where exists (select 1); 对user表记录逐条取出,由于子条件select 1永远能返回记录行,那么user表所有记录都将被加入结果集...使用了t2(B)表索引 三、结论 MySQLin语句是把外表内表作join连接,而exists语句是对外表作nest loop循环,每次loop循环再对内表进行查询。...《高性能MySQL》书籍上对于inexists描述 书上说,MySQL会把in查询语句改成exists再去执行(实际上我们在没有索引情况下,他们执行过程确实是一致) 在《MySQL技术内幕:SQL...不过对于下次处理类似的问题时,我已经有对应处理方案: 根据具体业务情况,分析出它对应可用经验法则,再进行不断测试调优,选出最优SQL。 而不仅仅是选择相信经验法则。

    16.2K71

    MySQL(八)|MySQLIn与Exists区别(2)

    关于In与Exists比较,先说结论,归纳出IN Exists适用场景: 1)IN查询在内部表外部表上都可以使用到索引。 2)Exists查询仅在内部表上可以使用到索引。...以下是原文,之前和我一起讨论这个问题朋友在跟他公司DBA讨论并做了几次实验之后整理文章如下: ---- 背景介绍 最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种方法SQL...实验过程 实验针对相同结果集INExists SQL语句进行分析。...原因分析 两者索引使用情况跟第一次实验是一致,唯一区别是子查询筛选结果集大小不同,但实验结果已经跟第一次不同了。...MySQL查询语句中IN Exists 对比分析 实验结论 根据上述两个实验及实验结果,我们可以较清晰理解IN Exists执行过程,并归纳出IN Exists适用场景: IN查询在内部表外部表上都可以使用到索引

    3.7K40

    图解sqlwhereon区别

    经常会有读者有疑问,sql关联条件是放where后面好,还是on后面好?今天就通过图形方式给大家来解决这个问题。 之前两章我们通过图解SQL执行顺序JOIN原理知道了这两步执行过程。...我们还是以上一章例题来讲解: 因为在sql内连接阶段,左表(a)右表(b)通过笛卡尔积生成虚表VT-A1, VT-A1 在经过内连接后会将虚表VT-A1符合条件 (a.CustomerID=b.CustomerID...表)未关联上其它所有数据都要添加到虚表VT-B1-1,所以在执行完LEFT动作之后,它结果变成了虚表VT-B2。...在理解了LEFT JOIN,RIGHT JOININNER JOIN原理后,再来看WHEREON区别就比较容易理解了。...结论 1、对于内连接(inner join),sql过滤条件放在where或者on后面没有区别 2、对于左右连接(left/right join),sql过滤条件放在where或者on后面有很大区别

    14510

    sqlddldml(sql与access区别)

    请点击http://www.captainbed.net DDLDML之间主要区别在于:DDL有助于更改数据库结构,而DML有助于管理数据库数据。...本质区别 DDL代表数据定义语言(Data Definition Language),是一种有助于创建数据库模式SQL命令。...而DML代表数据操作语言(Data Manipulation Language),是一种有助于检索管理关系数据库数据SQL命令。...命令上区别 DDL中常用命令有:create,drop,alter,truncaterename等等。而DML中常用命令有:insert,update,deleteselect等等。...影响上区别 DDL命令会影响整个数据库或表,而DML命令会影响表一个或多个记录。 回滚上区别 带有DDL命令SQL语句是自动提交,其更改将永久保存在数据库,无法回滚。

    80640

    SQL Server 性能优化之——T-SQL NOT IN NOT Exists

    这次介绍一下T-SQL“Not IN” “Not Exists优化。 Not IN Not Exists 命令 : 有些情况下,需要select/update/delete 操作孤立数据。...孤立数据:不存在主表而存在其关联表。 操作这样数据,一般第一反应是利用“Not in” 或 “Not Exists”命令。...选择NOT IN 还是 NOT Exists 现在SQL Server 中有两个命令可以使用大数据插入、更新、删除操作,性能方面比NOT IN有很大提高,语法简单比NOT Exists好很多,写出来语句看上去很清爽...但是Merge Except 两个命令在大数据处理方面的性能,要比 Not IN 好很多,代码简洁程度上,要比Not EXISTS好很多。不管你信不信,反正我信了!!!  ...上测试数据喽:Test1有400000条数据,Test2有500000条数据其中100000条数据name是不同  Select Not IN:18秒 ?

    3.1K71
    领券