<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖解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表中匹配的則有值,沒(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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色起五月天婷婷玉立亚洲 | 欧美成人版H性爽997777 | 国产豆花视频在线播放 | a∨中文字幕| 三级影院麻 |