吴忠躺衫网络科技有限公司

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

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

3天內(nèi)不再提示

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

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

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

WHY?

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

1、效率低

項目中遇到這么個情況:

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

但是這樣一句查詢 ↓

select*fromt1wherephonenotin(selectphonefromt2)

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

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

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

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

以 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)

結(jié)果是:

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

OK 木有問題!

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

selectid1fromtest1
whereid1in(selectid1fromtest2)

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

結(jié)果是:

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 直接查出錯誤結(jié)果的情況:

給test2插入一個空值:

insertintotest2(id2)values(NULL)

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

selectid1fromtest1
whereid1notin(selectid2fromtest2)

結(jié)果是:

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

空白!顯然這個結(jié)果不是我們想要的。我們想要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 了么?并沒有,一位大神曾經(jīng)說過,如果是確定且有限的集合時,可以使用。如 IN (0,1,2)。

審核編輯 :李倩



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

    關(guān)注

    8

    文章

    7145

    瀏覽量

    89590
  • Join
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    3270

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    長鑫已重新設(shè)計DRAM芯片,盡量避免使用美國原產(chǎn)技術(shù)

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

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

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

    C2000程序中全局變量的使用應(yīng)該盡量減少嗎

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

    如何去避免heisenbug

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

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

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

    如何避免高頻干擾?

    如何避免高頻干擾? 避免高頻干擾的基本思路是盡量降低高頻信號電磁場的干擾,也就是所謂的串擾(Crosstalk)。可用拉大高速信號和
    發(fā)表于 01-02 11:14 ?6282次閱讀

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

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

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

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

    PCB設(shè)計中的EMC問題怎么避免

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

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

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

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

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

    時鐘與復(fù)位信號設(shè)計方案

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

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

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

    如何避免PLC程序卡死

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

    在選取rc元件參數(shù)時,為什么應(yīng)盡量避免選取小電阻

    在選取RC元件(電阻和電容)參數(shù)時,應(yīng)盡量避免選取小電阻,這主要基于以下幾個方面的考慮: 1. 電壓分壓效應(yīng) 降低電壓輸出 :小電阻作為負載時,會與信號源的內(nèi)阻形成分壓電路,從而大幅度降低信號源輸出
    的頭像 發(fā)表于 09-18 15:32 ?634次閱讀
    百家乐投注方法投资法| 霍山县| 任你博百家乐官网娱乐城| 顶级赌场手机版官方| 百家乐官网博百家乐官网的玩法技巧和规则 | 大发888为什么卡| 云鼎百家乐官网的玩法技巧和规则| bet365娱乐城注册| 百家乐游戏高手| 大城县| 免费玩百家乐的玩法技巧和规则 | 大发888游戏场下载| 克拉克百家乐官网的玩法技巧和规则 | 百家乐赌场技巧大全| 百家乐官网二人视频麻将| 免费百家乐过滤工具| 百家乐官网投注平台信誉排行 | 太阳城百家乐主页| 百家乐官网视频游戏账号| 网络百家乐开户网| 乐享百家乐官网的玩法技巧和规则| 足球投注网| 百家乐视频游365| 百家乐官网怎么玩能赢钱| 水果机技巧| 百家乐有哪几种| 百家乐官网赢的秘籍在哪| 全讯网源码| 百家乐官方网址| 百家乐官网视频游戏账号| 大发888玩哪个能赢钱| 找查百家乐官网玩法技巧| 爱拼国际娱乐| 曼哈顿百家乐的玩法技巧和规则| 梦幻城百家乐官网的玩法技巧和规则 | 足球.百家乐官网投注网出租| 香港六合彩论坛| 网上百家乐赌场娱乐网规则| 星期八百家乐官网的玩法技巧和规则 | 百家乐筹码方形| 百家乐官网路单走势图|