转【】浅谈sql中的in与not in,exists与not exists的区别_

2023-11-01

浅谈sql中的in与not in,exists与not exists的区别

 

 

1、in和exists

in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

例如:表A(小表),表B(大表)

select * from A where cc in(select cc from B)  -->效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc)  -->效率高,用到了B表上cc列的索引。

相反的:

select * from B where cc in(select cc from A)  -->效率高,用到了B表上cc列的索引

select * from B where exists(select cc from A where cc=B.cc)  -->效率低,用到了A表上cc列的索引。

 

2、not in 和not exists

not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG,请看下面的例子:

create table #t1(c1 int,c2 int);

create table #t2(c1 int,c2 int);

insert into #t1 values(1,2);

insert into #t1 values(1,3);

insert into #t2 values(1,2);

insert into #t2 values(1,null);

 

select * from #t1 where c2 not in(select c2 from #t2);  -->执行结果:无

select * from #t1 where not exists(select 1 from #t2 where #t2.c2=#t1.c2)  -->执行结果:1  3

正如所看到的,not in出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select 语句的执行计划,也会不同,后者使用了hash_aj,所以,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in,并且可以通过提示让它用hasg_aj或merge_aj连接。

如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。

 

3、in 与 = 的区别

select name from student where name in('zhang','wang','zhao');

select name from student where name='zhang' or name='wang' or name='zhao'

的结果是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转【】浅谈sql中的in与not in,exists与not exists的区别_ 的相关文章

  • python 用eclipse编辑器编写唐僧打白骨精

    python 用eclipse编辑器编写唐僧打白骨精 coding utf 8 Created on 2019年7月10日 note 唐僧打白骨精 author LSW version 3 0 YaoGj 10 妖怪攻击力 YaoSm 10
  • 如何用echarts画一个好看的饼图

    前言 最近有个需求 需要绘制一个饼图 为此我根据这次需求来整理了一下关于 echarts 饼图绘制的一些知识点 在这次需求中我需要用到的属性我会详细讲解 其他的属性我会粗略地说一下 并加入其他博主的文章的跳转 综合案例在后续博客中更新 注意
  • android动画不占cpu如何实现,【实战总结】帧动画调优实践

    原标题 实战总结 帧动画调优实践 原文链接 https www zybuluo com avenwu note 876161 APP架构师整理发布 转载请联系作者获得授权 1 背景 在做动画的时候我们有很多选择方案 最常见的是Android
  • JBPM4—请假流程

    1 流程图 2 流程配置文件
  • 数据分析之——Adventure项目分析

    文章目录 数据分析 Adventure项目分析 内容摘要 一 项目简介 二 分析思路 三 分析过程 0 数据准备及清洗 1 导入模块 2 简单了解数据 3 数据处理 1 整体销售表现 1 自行车整体销售量表现 2 自行车整体销售金额表现 3
  • 直流电源线缆 高速电缆 分类

    线缆分类 直流电源线缆采用整长发货 现场需要根据实际使用长度进行截取并现场制作电源线 直流电源线缆包括 48V电源线和电源地线RTN 连接配电盒与配电屏的直流电源线缆的长度和接线端子需要根据工勘确定 直接与电源模块连接的直流电源线缆为OT端
  • VUE常用的自定义指令

    v directives 基于 vue 的自定义指令集合 包含 复制粘贴指令 v copy 长按指令 v longpress 输入框防抖指令 v debounce 禁止表情及特殊字符 v emoji 图片懒加载 v LazyLoad 权限校
  • mysql的分组group by

    文章目录 一 介绍 1 分组查询的内容 2 多字段分组 3 将查询内容连接group concat 4 有条件的分组查询having 一 介绍 将某个字段的相同值分为一组 分组查询的结果强调的是一个整体 每组内容只显示一行 分组查询的内容一
  • C语言-蓝桥杯-基础练习 矩阵乘法

    问题描述 给定一个N阶矩阵A 输出A的M次幂 M是非负整数 例如 A 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N M 1 lt N lt 30 0 lt M lt 5 表示矩阵A的阶数和要求的幂数 接下
  • Python爬虫之Js逆向案例(12)-知乎答案批量获取保存到CSV文件

    声明 知乎答案批量获取分析仅用于研究和学习 如有侵权 可联系删除 大家好 本期分享的内容是一个关于批量获取知乎答案的案例 本案例的重点是教大家在写爬虫时如何更规范的去编写自己的爬虫 场景是这样的 最近在帮一位同学排查几个爬虫问题 于是乎我三
  • Pandas实战-Series对象

    本文将主要介绍以下内容 1 Series概述 2 从Python对象创建Series 3 读取最前面和最后面的数据 4 数学运算 5 将Series传递给Python的内置函数 Series是Pandas的两个主要数据结构之一 它是用于存储
  • 强化学习-稀疏奖励

    稀疏奖励 出现的原因 训练agent的时候 多数时候agent获取不到reward 没有奖励或惩罚 乱探索什么也学不到 这是不是奖惩设置不合理的一种体现 解决方案 Reward Shaping Reward shaping 的思想是说环境有
  • Tomcat是如何隔离Web应用的

    Tomcat通过自定义的类加载器WebAppClassLoader打破了双亲委托机制 目的就是为了优化加载Web应用目录下的类 Tomcat 作为 Servlet 容器 它负责加载我们Servlet 类 此外它还负责加载 Servlet 所
  • (LeetCode) 两数相加-----C语言实现【详细讲解】

    目录 1 题目要求如下 2 做题之前我们先来分析一下题目 看看我们究竟要做什么 怎么做 3 下面我们将对代码进行分开讲解 4 最后附上完整的代码供大家学习参考 题目要求如下 给你两个 非空 的链表 表示两个非负的整数 它们每位数字都是按照
  • 用数组slice方法,更新视图

    用数组slice方法 更新视图 定义和用法 slice 方法可从已有的数组中返回选定的元素 slice 方法可提取字符串的某个部分 并以新的字符串返回被提取的部分 注意 slice 方法不会改变原始数组 var fruits Banana
  • HDD/SSD/NVM存储介质

    HDD SSD NVM存储介质 NonVolatile Memory 非易失存储器 具有非易失 按字节存取 存储密度高 低能耗 读写性能接近DRAM 但读写速度不对称 读远快于写 寿命有限 需要像ssd一样考虑磨损均衡 当电流关掉后 所存储
  • proteus8.8版本出现闪退的原因分析和解决方案

    如果 你是刚进入单片机仿真的小朋友 并且也对单片机仿真感兴趣 如遇到下列情况不要着急 这种情况的出现 原因我还没有找到或者说干脆没有分析明白 尝试过重新安装过软件 但未果 但是 对于proteus闪退的情况 可以告诉你一个亲测好用的方法 切
  • AI智能无损放大图片网站

    https bigjpg com
  • 使用superset完成mysql数据库或者hive数据库的数据可视化

    虚拟机安装步骤 注意事项 以下bigdata100均记得更换为bigdata1即可 确保本地电脑已经安装好了VMware Workstation Pro 下载地址 下载 VMware Workstation Pro CN 清华大学镜像源 h
  • Android学习博客和文章存档

    Android基础 Android总结篇 http blog csdn net codeemperor article details 51004189 Android最佳性能实践 一 合理管理内存 http blog csdn net g

随机推荐