0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么要盡量避免使用IN和NOT IN呢?

Android編程精選 ? 來源:博客園 ? 作者:博客園 ? 2022-03-18 09:46 ? 次閱讀

  • WHY?
    • 1、效率低
    • 2、容易出現(xiàn)問題,或查詢結果有誤 (不能更嚴重的缺點)
  • HOW?
    • 1、用 EXISTS 或 NOT EXISTS 代替
    • 2、用JOIN 代替

WHY?

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

1、效率低

項目中遇到這么個情況:

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

但是這樣一句查詢 ↓

select*fromt1wherephonenotin(selectphonefromt2)

直接就把我跑傻了。。。十幾分鐘,檢查了一下 phone在兩個表都建了索引,字段類型也是一樣的。原來not in 是不能命中索引的。。。。

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

select*fromt1
wherenotEXISTS(selectphonefromt2wheret1.phone=t2.phone)

2、容易出現(xiàn)問題,或查詢結果有誤 (不能更嚴重的缺點)

以 IN 為例。建兩個表:test1 和 test2

createtabletest1(id1int)
createtabletest2(id2int)

insertintotest1(id1)values(1),(2),(3)
insertintotest2(id2)values(1),(2)

我想要查詢,在test2中存在的 test1中的id 。使用IN的一般寫法是:

selectid1fromtest1
whereid1in(selectid2fromtest2)

結果是:

402b60b0-9474-11ec-952b-dac502259ad0.jpg圖片

OK 木有問題!

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

selectid1fromtest1
whereid1in(selectid1fromtest2)

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

結果是:

404094bc-9474-11ec-952b-dac502259ad0.jpg圖片

EXCUSE ME!為什么不報錯?

單獨查詢 select id1 from test2 是一定會報錯: 消息 207,級別 16,狀態(tài) 1,第 11 行 列名 'id1' 無效。

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

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

給test2插入一個空值:

insertintotest2(id2)values(NULL)

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

selectid1fromtest1
whereid1notin(selectid2fromtest2)

結果是:

4050c22e-9474-11ec-952b-dac502259ad0.jpg圖片

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

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

跑題一句:建表的時候最好不要允許含空值,否則問題多多。

HOW?

1、用 EXISTS 或 NOT EXISTS 代替

select*fromtest1
whereEXISTS(select*fromtest2whereid2=id1)

select*FROMtest1
whereNOTEXISTS(select*fromtest2whereid2=id1)

2、用JOIN 代替

selectid1fromtest1
INNERJOINtest2ONid2=id1

selectid1fromtest1
LEFTJOINtest2ONid2=id1
whereid2ISNULL

妥妥的沒有問題了!

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

審核編輯 :李倩



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6715

    瀏覽量

    88311
  • Join
    +關注

    關注

    0

    文章

    9

    瀏覽量

    3234

原文標題:面試官:為什么要盡量避免使用 IN 和 NOT IN 呢?

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    長鑫已重新設計DRAM芯片,盡量避免使用美國原產技術

    6月12日,日經新聞引述未具名消息人士報導,合肥長鑫已經重新設計了其DRAM芯片,以盡量減少對美國原產技術的使用。 日經:長鑫已重新設計DRAM芯片,盡量避免使用美國原產技術 據日經新聞亞洲評論報導
    發(fā)表于 06-13 18:30 ?3337次閱讀

    PCB走線時為什么要盡量避免銳角和直角?

    出現(xiàn),直角走線一般是布線中要求盡量避免的情況,也幾乎成為衡量布線好壞的標準之一,那么直角走線究竟會對信號傳輸產生多大的影響?  從原理上說,銳角、直角走線會使傳輸線的線寬發(fā)生變化,造成阻抗的不連續(xù)
    發(fā)表于 09-21 11:48

    C2000程序中全局變量的使用應該盡量減少嗎

    一般來說,編程時我們應該盡量減少使用全局變量,但是在DSP程序中,我們是不是應該也要盡量減少使用全局變量?
    發(fā)表于 12-11 13:50

    如何去避免heisenbug

    frangi黑森矩陣是什么意思?如何去避免heisenbug?有哪些解決辦法?
    發(fā)表于 10-19 09:03

    為什么C語言要避免使用Null指針

    為什么C語言要避免使用Null指針?指針作為數組的應用有哪些?
    發(fā)表于 12-20 07:19

    如何避免高頻干擾?

    如何避免高頻干擾? 避免高頻干擾的基本思路是盡量降低高頻信號電磁場的干擾,也就是所謂的串擾(Crosstalk)??捎美蟾咚傩盘柡?/div>
    發(fā)表于 01-02 11:14 ?6220次閱讀

    目前最不值得入手的4款華為手機,遇到時要盡量避開 都是“坑”!

    。每年華為都會給用戶帶來種種的驚喜,在這期間,它發(fā)布不少高性價比的手機,無論性能、外觀等綜合方面表現(xiàn)的都格外出色,成為不少發(fā)燒友的首選。然而并不是每一款華為手機都值得入手,有很多華為手機表面看上去毫無瑕疵,實際上都是坑,為避免大家入坑,小編盤點了目前最不值得入手的4款華為手機,遇到時
    的頭像 發(fā)表于 08-21 17:18 ?7082次閱讀

    為什么PCB布線中要盡量避免銳角和直角走線

    如果是射頻線,在轉角的地方如果是直角,則有不連續(xù)性,而不連續(xù)性將易導致高次模的產生,對輻射和傳導性能都有影響。RF信號線如果走直角,拐角處的有效線寬會增大,阻抗不連續(xù),引起信號反射。為了減小不連續(xù)性,要對拐角進行處理,有兩種方法:切角和圓角。圓弧角的半徑應足夠大,一般來說,要保證:R>3W。
    發(fā)表于 09-16 11:49 ?5634次閱讀
    為什么PCB布線中<b class='flag-5'>要盡量</b><b class='flag-5'>避免</b>銳角和直角走線

    PCB設計中的EMC問題怎么避免

    在文章的開篇就說過,EMC和SI、PI息息相關,很多時候我們會告訴大家,我們沒法進行EMC仿真,但我們會從板級來盡量避免一些EMC問題的發(fā)生,說白了其實就是盡量保證SI及PI的性能(這是我們的專長),從源頭上來
    發(fā)表于 10-13 09:43 ?1812次閱讀

    電路設計中為什么要盡量提高輸入阻抗?

    級的電流輸出能力減少了很大負擔。所以電路設計中盡量提高輸入阻抗。 再說輸出阻抗,它可以看做輸出端內阻 r,可以等效為一個理想信號源(電源)和這個內阻 r 的串聯(lián)。把它和下級電路的輸入阻抗結合起來看,就相當于一個理想信號源(電源)和
    的頭像 發(fā)表于 03-02 10:52 ?1.3w次閱讀

    電磁騷擾源為什么要盡量遠離孔洞開口?

    電磁騷擾源為什么要盡量遠離孔洞開口?? 電磁騷擾源指的是任何能夠生成電磁場或電磁波的設備或設施,這些電磁波可以干擾無線信號、危害人體健康或者破壞電子設備等。在現(xiàn)代社會中,電磁騷擾已經成為了一個
    的頭像 發(fā)表于 09-12 14:52 ?445次閱讀

    時鐘與復位信號設計方案

    我們設計時要盡可能避免在內部產生時鐘,如果操作不當,會導致設計功能和時序問題。總而言之,盡量在代碼中避免操作時鐘。
    的頭像 發(fā)表于 09-19 09:26 ?1015次閱讀
    時鐘與復位信號設計方案

    SMT貼片打樣如何盡量避免出現(xiàn)錫不飽滿

    在SMT貼片打樣過程中,焊接上錫是很重要的一步驟。焊點不飽滿對電路板的使用性能以及外形美觀度都會有非常嚴重的影響。
    的頭像 發(fā)表于 10-24 16:33 ?697次閱讀

    如何避免PLC程序卡死?

    編寫穩(wěn)定的程序:編寫良好的、穩(wěn)定的PLC程序是避免程序卡死的關鍵。確保程序邏輯清晰、簡潔,并遵循編程最佳實踐。避免死循環(huán)、邏輯錯誤和沖突的發(fā)生。
    的頭像 發(fā)表于 01-26 09:14 ?469次閱讀

    在選取rc元件參數時,為什么應盡量避免選取小電阻

    在選取RC元件(電阻和電容)參數時,應盡量避免選取小電阻,這主要基于以下幾個方面的考慮: 1. 電壓分壓效應 降低電壓輸出 :小電阻作為負載時,會與信號源的內阻形成分壓電路,從而大幅度降低信號源輸出
    的頭像 發(fā)表于 09-18 15:32 ?94次閱讀