<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統計

    最新評論

    圖解SQL的inner join、left join、right join、full outer join、union、union all的區別

    對于SQL的Join,在學習起來可能是比較亂的。我們知道,SQL的Join語法有很多inner的,有outer的,有left的,有時候,對于Select出來的結果集是什么樣子有點不是很清楚。Coding Horror上有一篇文章,通過文氏圖 Venn diagrams 解釋了SQL的Join。我覺得清楚易懂,轉過來。

    假設我們有兩張表。Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示:讓我們看看不同JOIN的不同

    A表
    id name
    1 Pirate
    2 Monkey
    3 Ninja
    4 Spaghetti
    B表
    id name
    1 Rutabaga
    2 Pirate
    3 Darth Vade
    4 Ninja

    1.INNER JOIN

    SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

    結果集
    (TableA.) (TableB.)
    id name id name
    1 Pirate 2 Pirate
    3 Ninja 4 Ninja

    Inner join 產生的結果集中,是A和B的交集。

    2.FULL [OUTER] JOIN 
    (1)
    SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 
    結果集
    (TableA.) (TableB.)
    id name id name
    1 Pirate 2 Pirate
    2 Monkey null null
    3 Ninja 4 Ninja
    4 Spaghetti null null
    null null 1 Rutabaga
    null null 3 Darth Vade
    Full outer join 產生A和B的并集。但是需要注意的是,對于沒有匹配的記錄,則會以null做為值。
    可以使用IFNULL判斷。
    (2)
    SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
    WHERE TableA.id IS null OR TableB.id IS null
    結果集
    (TableA.) (TableB.)
    id name id name
    2 Monkey null null
    4 Spaghetti null null
    null null 1 Rutabaga
    null null 3 Darth Vade
     產生A表和B表沒有交集的數據集。
     
    3.LEFT [OUTER] JOIN
    (1)
    SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
    結果集
    (TableA.) (TableB.)
    id name id name
    1 Pirate 2 Pirate
    2 Monkey null null
    3 Ninja 4 Ninja
    4 Spaghetti null null
    Left outer join 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。
    (2)
    SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.nameWHERE TableB.id IS null
    結果集
    (TableA.) (TableB.)
    id name id name
    2 Monkey null null
    4 Spaghetti null null

    產生在A表中有而在B表中沒有的集合。

    4.RIGHT [OUTER] JOIN
    RIGHT OUTER JOIN 是后面的表為基礎,與LEFT OUTER JOIN用法類似。這里不介紹了。
    5.UNION UNION ALL
    UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。
    請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。UNION 只選取記錄,而UNION ALL會列出所有記錄。
    (1)SELECT name FROM TableA UNION SELECT name FROM TableB
    新結果集
    name
    Pirate
    Monkey
    Ninja
    Spaghetti
    Rutabaga
    Darth Vade
    選取不同值
    (2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB
    新結果集
    name
    Pirate
    Monkey
    Ninja
    Spaghetti
    Rutabaga
    Pirate
    Darth Vade
    Ninja

    全部列出來

    (3)注意:

    SELECT * FROM TableA UNION SELECT * FROM TableB
    新結果集
    id name
    1 Pirate
    2 Monkey
    3 Ninja
    4 Spaghetti
    1 Rutabaga
    2 Pirate
    3 Darth Vade
    4 Ninja
    由于 id 1 Pirate   與 id 2 Pirate 并不相同,不合并
     
    還需要注冊的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:SELECT * FROM TableA CROSS JOIN TableB
    這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對于性能來說是非常危險的,尤其是表很大的時候。

    posted on 2014-02-15 08:46 奮斗成就男人 閱讀(292) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: a级特黄毛片免费观看| 插鸡网站在线播放免费观看| 亚洲中文字幕一区精品自拍| 亚洲av纯肉无码精品动漫| 三级网站免费观看| 国产亚洲视频在线播放| 亚洲国产成人久久| 美女露隐私全部免费直播| 日韩免费人妻AV无码专区蜜桃 | 久久免费高清视频| 国产成在线观看免费视频| 久久精品国产亚洲7777| 亚洲国产日韩在线成人蜜芽 | 1000部拍拍拍18勿入免费视频下载 | 亚洲精品成人无限看| 亚洲中文字幕久久精品无码VA| 久久天天躁狠狠躁夜夜免费观看| 亚洲一区二区三区播放在线| 中文字幕高清免费不卡视频 | 亚洲精品视频在线免费| 成人网站免费大全日韩国产| 亚洲综合另类小说色区| 久久大香伊焦在人线免费 | 久久91亚洲人成电影网站| 国产亚洲精品精品精品| 无码国产精品一区二区免费虚拟VR| 亚洲精品无码永久中文字幕| 无码一区二区三区免费| 亚洲精品乱码久久久久久按摩 | 亚洲爆乳AAA无码专区| 国产1024精品视频专区免费| 亚洲精品成a人在线观看夫 | 亚洲成网777777国产精品| 亚洲综合校园春色| 99视频全部免费精品全部四虎| 亚洲精品国产成人99久久| 中文字幕手机在线免费看电影| 中文字幕亚洲色图| 91青青青国产在观免费影视| 77777_亚洲午夜久久多人 | 在线亚洲精品自拍|