为什么要尽量避免使用IN和NOT IN呢?

why? 1、效率低 2、容易出现问题,或查询结果有误 (不能更严重的缺点) how? 1、用 exists 或 not exists 代替 2、用join 代替 why? 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 ,效率真的差好多。
select * from t1 where  not  exists (select phone from t2  where t1.phone =t2.phone) 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, 那么31 且 32 所以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)。


腾讯防疫健康码累计访问量破60亿 成全国服务用户最多的健康码
一文了解pcb电路板加急打样流程
特大型炼化企业冷凝水站扩容电控系统优化设计研究
使用GaN和Teseo提高应用效率
高通正式推出了全球首款扩展现实(XR)专用平台——Qualcomm®骁龙™XR1平台
为什么要尽量避免使用IN和NOT IN呢?
NAND,DRAM的供应不受冠状病毒爆发的影响
2019 IEDM:IBM和Leti论文
英伟达公司的人工智能技术正在成为好莱坞的下一个大明星
无人驾驶公司图森未来获UPS投资,加速无人驾驶卡车的商业落地
数传电台的接收灵敏/数传电台的网络诊断
一文带你了解波形数据库文件(WDB)和波配置文件(WCFG)
基于室内空气盒子产品的空气质量传感器TGS2600的特点介绍
光纤产业前景看好 创新能力有待加强
使用NVIDIA Omniverse演示火势预测的传统方法和CMM系统算法
惯性传感器肩负怎样的责任
中亿睿0.88拼接屏成功入驻湖北恩施汇通广场办公室
17个芯闻头条:全球半导体制造设备
自动化已成数字化转型的“灵丹妙药”
智能制造的七种形式