面試官:為什么要盡量避免使用 IN 和 NOT IN?大部分人都會(huì)答錯(cuò)!
作者:Hydor
來(lái)源: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、容易出現(xiàn)問(wèn)題,或查詢結(jié)果有誤 (不能更嚴(yán)重的缺點(diǎn))
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?是一定會(huì)報(bào)錯(cuò): 消息 207,級(jí)別 16,狀態(tài) 1,第 11 行 列名 'id1' 無(wú)效。insert?into?test2?(id2)?values?(NULL)
select?id1?from?test1
where?id1?not?in?(select?id2?from?test2)

跑題一句:建表的時(shí)候最好不要允許含空值,否則問(wèn)題多多。想成為架構(gòu)師,這份架構(gòu)師圖譜建議看看,少走彎路。
?
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
最近熬夜給大家準(zhǔn)備了非常全的一套Java一線大廠面試題。全面覆蓋BATJ等一線互聯(lián)網(wǎng)公司的面試題及解答,由BAT一線互聯(lián)網(wǎng)公司大牛帶你深度剖析面試題背后的原理,不僅授你以魚(yú),更授你以漁,為你面試掃除一切障礙。
資源,怎么領(lǐng)?。?/span>
掃二維碼,加我微信,備注:面試題
一定要備注:面試題,不要急哦,工作忙完后就會(huì)通過(guò)!

