釣友寶 (微信小程序):一款專門為 釣友 開發(fā)的 免費(fèi)的 分享釣點(diǎn)地圖與實(shí)時(shí)天氣的軟件,地圖中標(biāo)記了所有野釣、釣場(chǎng)、公共水域等的精確位置,支持導(dǎo)航、 預(yù)測(cè)釣魚位置的魚情 等功能。
IN 和 NOT IN 是比較常用的關(guān)鍵字,為什么要盡量避免呢?
項(xiàng)目中遇到這么個(gè)情況:
t1表 和 t2表 都是150w條數(shù)據(jù),600M的樣子,都不算大。
但是這樣一句查詢 ↓
select * from t1 where phone notin (select phone from t2)直接就把我跑傻了。。。十幾分鐘,檢查了一下 phone在兩個(gè)表都建了索引,字段類型也是一樣的。原來not in 是不能命中索引的。。。。
改成 NOT EXISTS 之后查詢 20s ,效率真的差好多。
select * from t1 where not EXISTS (select phone from t2 where t1.phone =t2.phone)2. 容易出現(xiàn)問題,或查詢結(jié)果有誤 (不能更嚴(yán)重的缺點(diǎn))createtable test1 (id1 int) createtable test2 (id2 int) insertinto test1 (id1) values (1),(2),(3) insertinto test2 (id2) values (1),(2)我想要查詢,在test2中存在的 test1中的id 。使用IN的一般寫法是:
select id1 from test1 where id1 in (select id2 from test2)結(jié)果是:
OK 木有問題!
select id1 from test1 where id1 in (select id1 from test2)不小心把id2寫成id1了 ,會(huì)怎么樣呢?
結(jié)果是:
EXCUSE ME!為什么不報(bào)錯(cuò)?
單獨(dú)查詢select id1 from test2是一定會(huì)報(bào)錯(cuò): 消息 207,級(jí)別 16,狀態(tài) 1,第 11 行 列名 'id1' 無效。另外,更多sql方面的面試題,公眾號(hào)Java精選,回復(fù)java面試,支持在線隨時(shí)隨地刷題。
然而使用了IN的子查詢就是這么敷衍,直接查出 1 2 3
這僅僅是容易出錯(cuò)的情況,自己不寫錯(cuò)還沒啥事兒,下面來看一下 NOT IN 直接查出錯(cuò)誤結(jié)果的情況:
給test2插入一個(gè)空值:
insertinto test2 (id2) values (NULL)我想要查詢,在test2中不存在的 test1中的id 。
select id1 from test1 where id1 notin (select id2 from test2)結(jié)果是:
空白!顯然這個(gè)結(jié)果不是我們想要的。我們想要3。為什么會(huì)這樣呢?
原因是:NULL不等于任何非空的值啊!如果id2只有1和2, 那么3<>1 且 3<>2 所以3輸出了,但是 id2包含空值,那么 3也不等于NULL 所以它不會(huì)輸出。
跑題一句:建表的時(shí)候最好不要允許含空值,否則問題多多。
1. 用 EXISTS 或 NOT EXISTS 代替
select * from test1 whereEXISTS (select * from test2 where id2 = id1 ) select * FROM test1 whereNOTEXISTS (select * from test2 where id2 = id1 )2. 用JOIN 代替select id1 from test1 INNERJOIN test2 ON id2 = id1 select id1 from test1 LEFTJOIN test2 ON id2 = id1 where id2 ISNULL妥妥的沒有問題了!
PS:那我們死活都不能用 IN 和 NOT IN 了么?并沒有,一位大神曾經(jīng)說過,如果是確定且有限的集合時(shí),可以使用。如 IN (0,1,2)。
Java精選面試題 (微信小程序):5000+道面試題和選擇題,包含Java基礎(chǔ)、MQ、Redis、SpringBoot、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!
來源:https://www.cnblogs.com/hydor/p/5391556.html
公眾號(hào)“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請(qǐng)聯(lián)系,筆者會(huì)第一時(shí)間刪除處理!
最近有很多人問,有沒有讀者或者摸魚交流群!加入方式很簡(jiǎn)單,公眾號(hào)Java精選,回復(fù)“加群”,即可入群!
文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.