當前位置: 妍妍網 > 碼農

公司新來一個技術總監:誰再在 SQL 中寫 in 和 not in,直接走人!

2024-04-02碼農

推薦關註

掃碼關註 後端架構師 」,選擇 星標 公眾號

重磅幹貨,第一時間送達!

責編:架構君 | 來源:網路

上一篇好文:

正文

大家好,我是後端架構師。

WHY?

IN 和 NOT IN 是比較常用的關鍵字,為什麽要盡量避免呢?

1、效率低

計畫中遇到這麽個情況:

t1表 和 t2表 都是150w條數據,600M的樣子,都不算大。

但是這樣一句查詢 ↓

select * from t1 where phone not in (select phone from t2)

直接就把我跑傻了。。。

十幾分鐘,檢查了一下 phone在兩個表都建了索引,欄位型別也是一樣的。原來 not in 是不能命中索引的。。。。

改成 NOT EXISTS 之後查詢 20s ,效率真的差好多。

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)

我想要查詢,在test2中存在的 test1中的id 。

使用 IN 的一般寫法是:

select id1 from test1
where id1 in (select id2 from test2)

結果是:

OK 木有問題!

但是如果我一時手滑,寫成了:

select id1 from test1
where id1 in (select id1 from test2)

不小心把id2寫成id1了 ,會怎麽樣呢?

結果是:

EXCUSE ME!為什麽不報錯?

單獨查詢 select id1 from test2 是一定會報錯: 訊息 207,級別 16,狀態 1,第 11 行 列名 'id1' 無效。另外,搜尋公眾號Linux就該這樣學後台回復「猴子」,獲取一份驚喜禮包。

空白!顯然這個結果不是我們想要的。我們想要3。為什麽會這樣呢?

原因是:NULL不等於任何 非空 的值啊!如果id2只有1和2, 那麽3<>1 且 3<>2 所以3輸出了,但是 id2包含空值,那麽 3也不等於NULL 所以它不會輸出。

HOW?

1、用 EXISTS 或 NOT EXISTS 代替

2、用JOIN 代替

PS:那我們死活都不能用 IN 和 NOT IN 了麽?並沒有,一位大神曾經說過,如果是確定且有限的集合時,可以使用。如 IN (0,1,2)。

你還有什麽想要補充的嗎?

最後,再次推薦下我們的AI星

為了跟上AI時代我幹了一件事兒,我建立了一個知識星球社群:ChartGPT與副業。想帶著大家一起探索 ChatGPT和新的AI時代

有很多小夥伴搞不定ChatGPT帳號,於是我們決定,凡是這三天之內加入ChatPGT的小夥伴,我們直接送一個正常可用的永久ChatGPT獨立帳戶。

不光是增長速度最快,我們的星球品質也絕對經得起考驗,短短一個月時間,我們的課程團隊釋出了 8個專欄、18個副業計畫

簡單說下這個星球能給大家提供什麽:

1、不斷分享如何使用ChatGPT來完成各種任務,讓你更高效地使用ChatGPT,以及副業思考、變現思路、創業案例、落地案例分享。

2、分享ChatGPT的使用方法、最新資訊、商業價值。

3、探討未來關於ChatGPT的機遇,共同成長。

4、幫助大家解決ChatGPT遇到的問題。

5、 提供一整年的售後服務,一起搞副業

星球福利:

1、加入星球4天後,就送ChatGPT獨立帳號。

2、邀請你加入ChatGPT會員交流群。

3、贈送一份完整的ChatGPT手冊和66個ChatGPT副業賺錢手冊。

其它福利還在籌劃中... 不過,我給你大家保證,加入星球後,收獲的價值會遠遠大於今天加入的門票費用 !

本星球第一期原價 399 ,目前屬於試營運,早鳥價 139 ,每超過50人漲價10元,星球馬上要來一波大的漲價,如果你還在猶豫,可能最後就要以 更高價格加入了 。。

早就是優勢。 建議大家盡早以便宜的價格加入!

歡迎有需要的同學試試,如果本文對您有幫助,也請幫忙點個 贊 + 在看 啦!❤️

在 還有更多優質計畫系統學習資源,歡迎分享給其他同學吧!

PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發、在看。

最後給讀者整理了一份BAT大廠面試真題,需要的可掃碼加微信備註:「面試」獲取。

版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝!

END

最近面試BAT,整理一份面試資料【Java面試BAT通關手冊】,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。在這裏,我為大家準備了一份2021年最新最全BAT等大廠Java面試經驗總結。

別找了,想獲取史上最全的Java大廠面試題學習資料

掃下方二維碼回復面試就好了

歷史好文:

掃碼關註後端架構師」,選擇星標公眾號

重磅幹貨,第一時間送達

,你在看嗎?