面试官:为什么要尽量避免使用 IN 和 NOT IN?大部分人都会答错!
共 1873字,需浏览 4分钟
·
2022-04-18 03:30
作者:Hydor
来源:https://www.cnblogs.com/hydor/p/5391556.html
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、容易出现问题,或查询结果有误 (不能更严重的缺点)
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)
select id1 from test1
where id1 in (select id1 from test2)
select id1 from test2
是一定会报错: 消息 207,级别 16,状态 1,第 11 行 列名 'id1' 无效。insert into test2 (id2) values (NULL)
select id1 from test1
where id1 not in (select id2 from test2)
跑题一句:建表的时候最好不要允许含空值,否则问题多多。想成为架构师,这份架构师图谱建议看看,少走弯路。
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
最近熬夜给大家准备了非常全的一套Java一线大厂面试题。全面覆盖BATJ等一线互联网公司的面试题及解答,由BAT一线互联网公司大牛带你深度剖析面试题背后的原理,不仅授你以鱼,更授你以渔,为你面试扫除一切障碍。
资源,怎么领取?
扫二维码,加我微信,备注:面试题
一定要备注:面试题,不要急哦,工作忙完后就会通过!