1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        圖解SQL的Join

        共 2411字,需瀏覽 5分鐘

         ·

        2021-03-24 13:02

        對(duì)于SQL的Join,在學(xué)習(xí)起來(lái)可能是比較亂的。我們知道,SQL的Join語(yǔ)法有很多inner的,有outer的,有l(wèi)eft的,有時(shí)候,對(duì)于Select出來(lái)的結(jié)果集是什么樣子有點(diǎn)不是很清楚。Coding Horror上有一篇文章(實(shí)在不清楚為什么Coding Horror也被墻)通過(guò) 文氏圖 Venn diagrams 解釋了SQL的Join。我覺(jué)得清楚易懂,轉(zhuǎn)過(guò)來(lái)。

        假設(shè)我們有兩張表。

        • Table A 是左邊的表。

        • Table B 是右邊的表。

        其各有四條記錄,其中有兩條記錄是相同的,如下所示:

        id name             id  name-- ----             --  ----1  Pirate           1   Rutabaga2  Monkey           2   Pirate3  Ninja            3   Darth Vader4  Spaghetti        4   Ninja

        下面讓我們來(lái)看看不同的Join會(huì)產(chǎn)生什么樣的結(jié)果。

        1. Inner join

        Inner join產(chǎn)生的結(jié)果集中,是A和B的交集。

        SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
        id name id name-- ---- -- ----1 Pirate 2 Pirate3 Ninja 4 Ninja

        2. Full outer join

        Full outer join 產(chǎn)生A和B的并集。但是需要注意的是,對(duì)于沒(méi)有匹配的記錄,則會(huì)以null做為值。

        SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
        id name id name-- ---- -- ----1 Pirate 2 Pirate2 Monkey null null3 Ninja 4 Ninja4 Spaghetti null nullnull null 1 Rutabaganull null 3 Darth Vader

        3. Left outer join

        3.1 產(chǎn)生一個(gè)表的完全集

        Left outer join 產(chǎn)生表A的完全集,而B(niǎo)表中匹配的則有值,沒(méi)有匹配的則以null值取代。

        SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
        id name id name-- ---- -- ----1 Pirate 2 Pirate2 Monkey null null3 Ninja 4 Ninja4 Spaghetti null null


        3.2 產(chǎn)生一個(gè)表存在而另一個(gè)表不存在的數(shù)據(jù)集

        SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null 
        id name id name-- ---- -- ----2 Monkey null null4 Spaghetti null null


        3.3 產(chǎn)生兩個(gè)表不同時(shí)出現(xiàn)的數(shù)據(jù)集

        SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
        id name id name-- ---- -- ----2 Monkey null null4 Spaghetti null nullnull null 1 Rutabaganull null 3 Darth Vader

        還需要注冊(cè)的是我們還有一個(gè)是“交差集” cross join, 這種Join沒(méi)有辦法用文式圖表示,因?yàn)槠渚褪前驯鞟和表B的數(shù)據(jù)進(jìn)行一個(gè)N*M的組合,即笛卡爾積。表達(dá)式如下:

        SELECT * FROM TableA CROSS JOIN TableB

        這個(gè)笛卡爾乘積會(huì)產(chǎn)生 4 x 4 = 16 條記錄,一般來(lái)說(shuō),我們很少用到這個(gè)語(yǔ)法。但是我們得小心,如果不是使用嵌套的select語(yǔ)句,一般系統(tǒng)都會(huì)產(chǎn)生笛卡爾乘積然再做過(guò)濾。這是對(duì)于性能來(lái)說(shuō)是非常危險(xiǎn)的,尤其是表很大的時(shí)候。


        瀏覽 38
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天撸天天色 | 久久高潮| 青青草伊人网 | 长腿校花无力呻吟娇喘的视频 | 91天天综合网 | 国产精品久久久久久久久久久久午夜片 | 大雞巴弄得我好舒服黃片动漫版 | 我与娇妻第一次玩3p竟上瘾 | 免费无遮挡 网站在线观看 | 粉嫩91精品久久久久久久99蜜桃 |