专栏首页datartisanSQL 中 EXISTS 用法详解

SQL 中 EXISTS 用法详解

EXISTS

首先来看一个示例

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

列 LIKE 字符串或者列 BETWEEN 值 1 AND 值 2这样的谓词需要指定 2 个以上的参数,而 EXIST 的左侧并没有任何参数。因为 EXIST 是只有 1 个参数的谓词。所以,EXIST 只需要在右侧书写 1 个参数,该参数通常都会是一个子查询。如果子查询返回任何行,EXISTS 子查询为 TRUE。

EXISTS 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。或许你一直认为 EXISTS 比 IN 语句的效率要高,这种说法是不准确的。

那到底该如何选择呢?

  • 如果查询的两个表大小相当,那么用 EXISTS 和 IN 差别不大
  • 如果两个表中一个较小,一个是大表,则子查询表大的用 EXISTS,子查询表小的用 IN

来看两个示例,假设 表 t1 为小表,表 t2 为大表

  1. 子查询为表 t2
select * from t1 
where id in (select id from t2) 
//效率低,用到了 t1 表上 id 列的索引;
 
select * from t1 
where exists(select id from t2 where id=t1.id) 
//效率高,用到了 t2 表上 id 列的索引。 
  1. 子查询为表 t1
select * from t2 
where id in (select id from t1) 
//效率高,用到了t2 表上 id 列的索引;
 
select * from t2 
where exists(select id from t1 where id=t2.id) 
//效率低,用到了 t1 表上 id 列的索引。

上述示例中,在大表查询中使用了索引的用法效率更高。

NOT EXISTS

就像 EXIST 可以用来替换 IN 一样, NOT IN 也可以用 NOT EXIST来替换。

select * from t2 
where id not in (select id from t1) 
//效率低,内外表都进行全表扫描,不能用到索引;

select * from t2 
where not exists(select id from t1 where id=t2.id)
//效率高,用到了 t1 表上 id 列的索引。

如果查询语句使用了 NOT IN 那么内外表都进行全表扫描,没有用到索引;而 NOT EXISTS 的子查询依然能用到表上的索引。所以可以得出结论:

  • 所以无论哪个表大,用 NOT EXISTS 都比 NOT IN 要快。

-- END --

本文分享自微信公众号 - 乐享数据8090(gh_5703273a0562),作者:mba1398

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL语句中exists/not exists的用法分析

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    chenchenchen
  • 数据库 SQL中IN和EXISTS用法的区别

    in: in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,他是先将数据督导内存中,然后取与外表匹配。他要执行的次数是外表的长度*内表结果的...

    Java架构师必看
  • 神奇的 SQL 之性能优化 → 让 SQL 飞起来

    在像 Web 服务这样需要快速响应的应用场景中,SQL 的性能直接决定了系统是否可以使用;特别在一些中小型应用中,SQL 性能更是决定服务能否快速响应的唯一标准

    青石路
  • 玩转Mysql系列 - 第20篇:异常捕获及处理详解

    此时我们需要使用游标,通过游标的方式来遍历select查询的结果集,然后对每行数据进行处理。

    路人甲Java
  • 让MySQL速度提升3倍的19种优化方式

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    数据和云
  • 项目中让 MySQL 速度提升 3 倍的 19 种优化方式

    本文总结了 19 条关于 MySQL 的优化方案,本文的优化方案都是基于 “ MySQL-索引-BTree 类型 ” 。希望对你有帮助,码字不易,如果觉得有用,...

    JiekeXu之路
  • 效率提高N倍的19条MySQL优化秘籍

    原文:http://www.enmotech.com/web/detail/1/700/1.html  (复制链接,打开浏览器即可查看原文)

    数据和云01
  • 效率提高N倍的19条MySQL优化秘籍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    数据和云
  • 效率提高N倍的19条MySQL优化秘籍

    出处:https://zhuanlan.zhihu.com/p/49888088

    Python数据科学
  • 面试官问你MySQL的优化,看这篇文章就够了

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    框架师
  • 数据库:exists; not exists应用,查询选修了全部课程的学生姓名

    数据库SQL语句中 查询选修了全部课程的学生的学号和姓名查询选修了全部课程的学生姓名。

    Java架构师必看
  • 看图说话:SQL注入(SQL Injection)漏洞示例

    不知道有没有测试同仁遇到过类似这样的情景:登录或者查询数据失败的时候,程序给出了一个包含SQL脚本的提示框。作为测试人员,我们隐约感觉这样的提示信息不友...

    张树臣
  • 实时数仓|基于Flink1.11的SQL构建实时数仓探索实践

    实时数仓主要是为了解决传统数仓数据时效性低的问题,实时数仓通常会用在实时的OLAP分析、实时的数据看板、业务指标实时监控等场景。虽然关于实时数仓的架构及技术选型...

    Spark学习技巧
  • 项目中至少提高3倍的19条MySQL优化

    本文我们来谈谈项目中常用的MySQL优化方法,巧用这19条技巧,至少提高3倍效率,具体如下:

    格姗知识圈
  • 19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    Rookie
  • 19条效率至少提高3倍的MySQL技巧

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    JAVA葵花宝典
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    Java团长
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    JAVA葵花宝典
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    java思维导图

扫码关注云+社区

领取腾讯云代金券