日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试官:为什么要尽量避免使用 IN 和 NOT IN?大部分人都会答错!

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官:为什么要尽量避免使用 IN 和 NOT IN?大部分人都会答错! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:Hydor
來源:https://www.cnblogs.com/hydor/p/5391556.html

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 。最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。

使用 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' 無效。

然而使用了IN的子查詢就是這么敷衍,直接查出 1 2 3

這僅僅是容易出錯的情況,自己不寫錯還沒啥事兒,下面來看一下 NOT IN 直接查出錯誤結果的情況:

給test2插入一個空值:

insert?into?test2?(id2)?values?(NULL)

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

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

結果是:

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

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

跑題一句:建表的時候最好不要允許含空值,否則問題多多。想成為架構師,這份架構師圖譜建議看看,少走彎路。

?

HOW?

1、用 EXISTS 或 NOT EXISTS 代替

select?*??from?test1where?EXISTS?(select?*?from?test2??where?id2?=?id1?)select?*??FROM?test1where?NOT?EXISTS?(select?*?from?test2??where?id2?=?id1?)

2、用JOIN 代替

select?id1?from?test1INNER?JOIN?test2?ON?id2?=?id1select?id1?from?test1LEFT?JOIN?test2?ON?id2?=?id1where?id2?IS?NULL

妥妥的沒有問題了!

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

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的面试官:为什么要尽量避免使用 IN 和 NOT IN?大部分人都会答错!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。