面試官:為什么要盡量避免使用 IN 和 NOT IN 呢?
300本計(jì)算機(jī)編程的經(jīng)典書籍下載
AI全套:Python3+TensorFlow打造人臉識(shí)別智能小程序
最新人工智能資料-Google工程師親授 Tensorflow-入門到進(jìn)階
黑馬頭條項(xiàng)目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版
來源:cnblogs.com/hydor/p/5391556.html
WHY?
IN 和 NOT IN 是比較常用的關(guān)鍵字,為什么要盡量避免呢?
1、效率低?
但是這樣一句查詢 ↓
select * from t1 where phone not in (select phone from t2)select * from t1where not EXISTS (select phone from t2 where t1.phone =t2.phone)
2、容易出現(xiàn)問題,或查詢結(jié)果有誤 (不能更嚴(yán)重的缺點(diǎn))
以 IN 為例。建兩個(gè)表: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 test1where id1 in (select id2 from test2)
結(jié)果是:?

OK 木有問題!
但是如果我一時(shí)手滑,寫成了:
select id1 from test1where id1 in (select id1 from test2)

EXCUSE ME!為什么不報(bào)錯(cuò)??
給test2插入一個(gè)空值:
insert into test2 (id2) values (NULL)select id1 from test1where id1 not in (select id2 from test2)
結(jié)果是:

空白!顯然這個(gè)結(jié)果不是我們想要的。我們想要3。為什么會(huì)這樣呢?
原因是:NULL不等于任何非空的值啊!如果id2只有1和2, 那么3<>1 且 3<>2 所以3輸出了,但是 id2包含空值,那么 3也不等于NULL 所以它不會(huì)輸出。
(跑題一句:建表的時(shí)候最好不要允許含空值,否則問題多多。)
select * from test1where EXISTS (select * from test2 where id2 = id1 )select * FROM test1where NOT EXISTS (select * from test2 where id2 = id1 )
select id1 from test1INNER JOIN test2 ON id2 = id1select id1 from test1LEFT JOIN test2 ON id2 = id1where id2 IS NULL
全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂于分享的朋友們一起交流學(xué)習(xí)。
Flutter 移動(dòng)應(yīng)用開發(fā)實(shí)戰(zhàn) 視頻(開發(fā)你自己的抖音APP) Java面試進(jìn)階訓(xùn)練營(yíng) 第2季(分布式篇) Java高級(jí) - 分布式系統(tǒng)開發(fā)技術(shù)視頻
2019最新Python視頻:從入門到Swiper項(xiàng)目實(shí)戰(zhàn)
2019重磅高級(jí)資源:Java并發(fā)編程原理和實(shí)戰(zhàn)
最新黑馬大數(shù)據(jù)資源:深入解析docker容器化技術(shù)
最新Java后端實(shí)戰(zhàn)視頻:SSM框架在線商城系統(tǒng)
2019最新黑客技術(shù)之Windows網(wǎng)絡(luò)安全精講
2019最新Python實(shí)戰(zhàn)視頻:Python+Django項(xiàng)目實(shí)
黑馬 - Python數(shù)據(jù)結(jié)構(gòu)與算法系列課程
