Sql語(yǔ)句中IN和exists的區(qū)別及應(yīng)用

轉(zhuǎn)自:精品唯居

表展示

    首先捏检,查詢(xún)中涉及到的兩個(gè)表梁丘,一個(gè)user和一個(gè)order表择浊,具體表的內(nèi)容如下:

    user表:

    order表:


  in

    確定給定的值是否與子查詢(xún)或列表中的值相匹配追城。in在查詢(xún)的時(shí)候,首先查詢(xún)子查詢(xún)的表故觅,然后將內(nèi)表和外表做一個(gè)笛卡爾積谐区,然后按照條件進(jìn)行篩選。所以相對(duì)內(nèi)表比較小的時(shí)候逻卖,in的速度較快。

    具體sql語(yǔ)句如下:

1SELECT 2* 3FROM 4`user` 5WHERE 6`user`.idIN ( 7SELECT 8`order`.user_id 9FROM10`order`11)

    這條語(yǔ)句很簡(jiǎn)單昭抒,通過(guò)子查詢(xún)查到的user_id 的數(shù)據(jù)评也,去匹配user表中的id然后得到結(jié)果。該語(yǔ)句執(zhí)行結(jié)果如下:

    它的執(zhí)行流程是什么樣子的呢灭返?讓我們一起來(lái)看一下盗迟。

    首先,在數(shù)據(jù)庫(kù)內(nèi)部熙含,查詢(xún)子查詢(xún)罚缕,執(zhí)行如下代碼:

SELECT? ? ? ? ? ? `order`.user_idFROM? ? ? ? ? ? `order`

    執(zhí)行完畢后,得到結(jié)果如下:

    此時(shí)糖耸,將查詢(xún)到的結(jié)果和原有的user表做一個(gè)笛卡爾積富纸,結(jié)果如下:

此時(shí)滞乙,再根據(jù)我們的user.id IN order.user_id的條件,將結(jié)果進(jìn)行篩選(既比較id列和user_id 列的值是否相等腌乡,將不相等的刪除)。最后夜牡,得到兩條符合條件的數(shù)據(jù)与纽。

  exists

    指定一個(gè)子查詢(xún),檢測(cè)行的存在。遍歷循環(huán)外表急迂,然后看外表中的記錄有沒(méi)有和內(nèi)表的數(shù)據(jù)一樣的影所。匹配上就將結(jié)果放入結(jié)果集中。

    具體sql語(yǔ)句如下:

1SELECT 2`user`.* 3FROM 4`user` 5WHERE 6EXISTS ( 7SELECT 8`order`.user_id 9FROM10`order`11WHERE12`user`.id=`order`.user_id13)

    這條sql語(yǔ)句的執(zhí)行結(jié)果和上面的in的執(zhí)行結(jié)果是一樣的僚碎。

    但是猴娩,不一樣的是它們的執(zhí)行流程完全不一樣:

    使用exists關(guān)鍵字進(jìn)行查詢(xún)的時(shí)候,首先听盖,我們先查詢(xún)的不是子查詢(xún)的內(nèi)容胀溺,而是查我們的主查詢(xún)的表,也就是說(shuō)皆看,我們先執(zhí)行的sql語(yǔ)句是:

SELECT?`user`.*?FROM?`user`

    得到的結(jié)果如下:

    然后仓坞,根據(jù)表的每一條記錄,執(zhí)行以下語(yǔ)句腰吟,依次去判斷where后面的條件是否成立:

EXISTS (

? ? ? ? SELECT? ? ? ? ? ? `order`.user_idFROM? ? ? ? ? ? `order`

? ? ? ? WHERE? ? ? ? ? ? `user`.id=`order`.user_id? ? )

    如果成立則返回true不成立則返回false无埃。如果返回的是true的話(huà),則該行結(jié)果保留毛雇,如果返回的是false的話(huà)嫉称,則刪除該行,最后將得到的結(jié)果返回灵疮。

  區(qū)別及應(yīng)用場(chǎng)景

    in 和 exists的區(qū)別: 如果子查詢(xún)得出的結(jié)果集記錄較少织阅,主查詢(xún)中的表較大且又有索引時(shí)應(yīng)該用in, 反之如果外層的主查詢(xún)記錄較少,子查詢(xún)中的表大震捣,又有索引時(shí)使用exists荔棉。其實(shí)我們區(qū)分in和exists主要是造成了驅(qū)動(dòng)順序的改變(這是性能變化的關(guān)鍵),如果是exists蒿赢,那么以外層表為驅(qū)動(dòng)表润樱,先被訪(fǎng)問(wèn),如果是IN羡棵,那么先執(zhí)行子查詢(xún)壹若,所以我們會(huì)以驅(qū)動(dòng)表的快速返回為目標(biāo),那么就會(huì)考慮到索引及結(jié)果集的關(guān)系了 皂冰,另外IN時(shí)不對(duì)NULL進(jìn)行處理店展。

    in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán)秃流,每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢(xún)壁查。一直以來(lái)認(rèn)為exists比in效率高的說(shuō)法是不準(zhǔn)確的。

  not in 和not exists

    如果查詢(xún)語(yǔ)句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描剔应,沒(méi)有用到索引睡腿;而not extsts 的子查詢(xún)依然能用到表上的索引语御。所以無(wú)論那個(gè)表大,用not exists都比not in要快席怪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末应闯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挂捻,更是在濱河造成了極大的恐慌碉纺,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刻撒,死亡現(xiàn)場(chǎng)離奇詭異骨田,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)声怔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)态贤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人醋火,你說(shuō)我怎么就攤上這事悠汽。” “怎么了芥驳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵柿冲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我兆旬,道長(zhǎng)假抄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任丽猬,我火速辦了婚禮宿饱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宝鼓。我一直安慰自己,他們只是感情好巴刻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布愚铡。 她就那樣靜靜地躺著,像睡著了一般胡陪。 火紅的嫁衣襯著肌膚如雪沥寥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天柠座,我揣著相機(jī)與錄音邑雅,去河邊找鬼。 笑死妈经,一個(gè)胖子當(dāng)著我的面吹牛淮野,可吹牛的內(nèi)容都是我干的捧书。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼骤星,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼经瓷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起洞难,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舆吮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后队贱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體色冀,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年柱嫌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锋恬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慎式,死狀恐怖伶氢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘪吏,我是刑警寧澤癣防,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站掌眠,受9級(jí)特大地震影響蕾盯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓝丙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一级遭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渺尘,春花似錦挫鸽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至医咨,卻和暖如春枫匾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拟淮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工干茉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人很泊。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓角虫,卻偏偏與公主長(zhǎng)得像沾谓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子上遥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容