来源:cnblogs.com/hydor/p/5391556.html

IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?

1、效率低 

项目中遇到这么个情况:

t1表 和 t2表  都是150w条数据,600M的样子,都不算大。

但是这样一句查询 ↓

select * from t1 where phone not in (select phone from t2)

直接就把我跑傻了。。。十几分钟,检查了一下  phone在两个表都建了索引,字段类型也是一样的。原来not in 是不能命中索引的。。。。

改成 NOT EXISTS 之后查询 20s ,效率真的差好多。

2、容易出现问题,或查询结果有误 (不能更严重的缺点)

以 IN 为例。建两个表:test1 和 test2

create table test1 (id1 int)create table test2 (id2 int)
insert into test1 (id1) values (1),(2),(3)insert into test2 (id2) values (1),(2)我想要查询,在test2中存在的  test1中的id 。使用IN的一般写法是:​​​​​​​
select id1 from test1 where id1 in (select id2 from test2)

结果是:  OK 木有问题!

但是如果我一时手滑,写成了:​​​​​​​

select id1 from test1 where id1 in (select id1 from test2)

不小心把id2写成id1了 ,会怎么样呢?

结果是:

EXCUSE ME!为什么不报错?

单独查询 select id1 from test2 是一定会报错: 消息 207,级别 16,状态 1,第 11 行 列名 'id1' 无效。

然而使用了IN的子查询就是这么敷衍,直接查出 1 2 3

这仅仅是容易出错的情况,自己不写错还没啥事儿,下面来看一下 NOT IN 直接查出错误结果的情况:

给test2插入一个空值:

insert into test2 (id2) values (NULL)

我想要查询,在test2中不存在的  test1中的id 。​​​​​​​

select id1 from test1 where id1 not in (select id2 from test2)

结果是:

空白!显然这个结果不是我们想要的。我们想要3。为什么会这样呢?

原因是:NULL不等于任何非空的值啊!如果id2只有1和2, 那么3<>1 且 3<>2 所以3输出了,但是 id2包含空值,那么 3也不等于NULL 所以它不会输出。

(跑题一句:建表的时候最好不要允许含空值,否则问题多多。)

HOW?

1、用 EXISTS 或 NOT EXISTS 代替​​​​​​​

select *  from test1    where EXISTS (select * from test2  where id2 = id1 )
select *  FROM test1   where NOT EXISTS (select * from test2  where id2 = id1 )

2、用JOIN 代替​​​​​​​

 select id1 from test1    INNER JOIN test2 ON id2 = id1     select id1 from test1    LEFT JOIN test2 ON id2 = id1    where id2 IS NULL

妥妥的没有问题了!

PS:那我们死活都不能用 IN 和 NOT IN 了么?并没有,一位大神曾经说过,如果是确定且有限的集合时,可以使用。如 IN (0,1,2)。

Mysql 避免使用 IN 和 NOT IN相关推荐

  1. mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间

    先贴一张图! 第一步,"很重要" 在mysql中,有一个创建之初自带的库information_schema,这个库中包含着数据库相关信息,查询数据占用空间就是使用该库,所以首先进 ...

  2. mysql并发更新数据,多用户并发修改数据解决方案。

    mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...

  3. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。

    下面有两条sql,主键查询,在mysql中查询到的结果相同. SELECT* FROM USER WHEREid = 'EM58hdK4nXC';SELECT* FROM USER WHEREid = ...

  4. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  5. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  6. docker一步安装mysql,docker的魅力就在于此

    正常来说,使用docker安装东西的步骤是serach它有没有,然后pull它 这里其实只要一步(如果你没有安装过.没有端口占用等问题的话!!) $ docker run -d -p 3306:330 ...

  7. 设置腾讯云linux服务器中 MySQL 允许远程访问

    申请了一台linux腾讯云服务器,想要把数据库搭建在上面,本地的Windows直接可以访问 以下就是具体的操作流程,首先你需要安装好一个mysql,安装方法–>mysql安装(Linux) 接着 ...

  8. Linux安装mysql,一步到位!

    今天在腾讯云上面买了一个服务器,想要把自己的项目部署一下,就要安装mysql,以下是我的安装步骤,在网上有很多人把install敲错了,还有的少-get,种种错误试完之后,我决定发一篇 sudo ap ...

  9. Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

    Mysql函数group_concat.find_in_set进行数据库字段值翻译 场景 配方表:记录包含的原料 sources表示原料,字段值之间用逗号分隔 原料表:对应原料id和原料名称 现需要查 ...

  10. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

最新文章

  1. PHOTOSHOP 快捷键
  2. 玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历
  3. 怎么取消自动格式化_iPhone自动扣费怎么取消?App Store、微信、支付宝关闭自动扣费教程...
  4. Django Model View Template 之间的简单交互 (二)
  5. kd树 python实现_kd树 寻找k近邻算法 python实现
  6. bzoj 1556 墓地秘密 —— 状压DP
  7. FFmpeg下载编译好的WINDOWS库头文件
  8. 脚本录制软件python 按键精灵 tc_Keymouse Go鼠标键盘脚本录制下载|开源版按键精灵软件_最火软件站...
  9. 分享一个在线301跳转代码生成工具
  10. ctf之7z文件爆破
  11. 看Python应乎潮流的72变
  12. delphi向控件发送消息,全选、复制、黏贴,sendmessage
  13. SQL GETDATE()日期格式化函数
  14. 20160803 - C:\WINDOWS\system32\config\systemprofile\Desktop 不可用的解决
  15. app用mysql数据库文件,需要将fdb数据文件导入mysql数据库
  16. iphone 应用程序设置和默认设置
  17. 基恩士 sw1000 或2000(理论是通用)usb转RS232 USB60FW 驱动
  18. centos7 如何用无线网卡连接wifi
  19. 校园网搭建设计与规划
  20. c语言如何热敏电阻转成温度,NTC热敏电阻查表程序如何转换成温度显示?

热门文章

  1. Retrofit中如何正确的使用https?
  2. 能改变你一生的五句话
  3. 转行游戏公司却无从下手,游戏美术设计这个岗位再不了解就晚了!
  4. 重点人口动态管控轨迹分析系统开发,可视化大数据平台建设
  5. MATLAB矩阵每行按降序排列,每列升序并记录行号
  6. Flink新特性之非对齐检查点(unaligned checkpoint)简介
  7. 中国石墨烯防腐涂料行业市场供需与战略研究报告
  8. 自考本计算机应用免试,惊喜!自考计算机科目可以免试?
  9. 基于JavaWeb的MarkDown编辑器editor.md的使用
  10. HTML+CSS flex弹性布局