面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?
来源:cnblogs.com/hydor/p/5391556.html
WHY?
IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?
1、效率低
但是这样一句查询 ↓
select * from t1 where phone not in (select phone from t2)
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)
select id1 from test1
where id1 in (select id2 from test2)
结果是:
OK 木有问题!
但是如果我一时手滑,写成了:
select id1 from test1
where id1 in (select id1 from test2)
EXCUSE ME!为什么不报错?
给test2插入一个空值:
insert into test2 (id2) values (NULL)
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 所以它不会输出。
(跑题一句:建表的时候最好不要允许含空值,否则问题多多。)
select * from test1
where EXISTS (select * from test2 where id2 = id1 )
select * FROM test1
where NOT EXISTS (select * from test2 where id2 = id1 )
select id1 from test1
INNER JOIN test2 ON id2 = id1
select id1 from test1
LEFT JOIN test2 ON id2 = id1
where id2 IS NULL
评论