面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?

张开发
2026/4/17 11:24:31 15 分钟阅读

分享文章

面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?
WHY1、效率低2、容易出现问题或查询结果有误 不能更严重的缺点HOW1、用 EXISTS 或 NOT EXISTS 代替2、用JOIN 代替WHYIN 和 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 t1where not EXISTS (select phone from t2 where t1.phone t2.phone)2、容易出现问题或查询结果有误 不能更严重的缺点以 IN 为例。建两个表test1 和 test2create 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 test1where id1 in (select id2 from test2)结果是图片OK 木有问题但是如果我一时手滑写成了select id1 from test1where 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 test1where id1 not in (select id2 from test2)结果是图片空白显然这个结果不是我们想要的。我们想要3。为什么会这样呢原因是NULL不等于任何非空的值啊如果id2只有1和2 那么31 且 32 所以3输出了但是 id2包含空值那么 3也不等于NULL 所以它不会输出。跑题一句建表的时候最好不要允许含空值否则问题多多。HOW1、用 EXISTS 或 NOT EXISTS 代替select * from test1where EXISTS (select * from test2 where id2 id1 )select * FROM test1where NOT EXISTS (select * from test2 where id2 id1 )2、用JOIN 代替select id1 from test1INNER JOIN test2 ON id2 id1select id1 from test1LEFT JOIN test2 ON id2 id1where id2 IS NULL妥妥的没有问题了PS那我们死活都不能用 IN 和 NOT IN 了么并没有一位大神曾经说过如果是确定且有限的集合时可以使用。如 IN 012。

更多文章