圖解 SQL 各種連接查詢之間的區別


  轉載自:http://blog.csdn.net/xuanjiewu/article/details/50636465

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

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

1.  INNER JOIN

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

結果集為交集。

2. FULL [OUTER] JOIN 

(1)

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 

Full outer join 產生A和B的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做為值。

可以使用IFNULL判斷。

注意:這個在獲取到數據進行展示的時候,要注意NULL的判斷。

(2) 同時使用ISNULL 的判斷,可以取得A和B兩者沒有交集的數據集。

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null

總結:這個很好用,可以用來對生產或者測試上的數據進行補數據的操作。

 

3. LEFT [OUTER] JOIN

(1)  SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

注意:這個可能很常用,但是注意B中匹配到了才有值,沒有匹配到會變成NULL

 

(2) LEFT JOIN 結合where IS NULL ,可以取得只有在A中的數據集。

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

 

4. RIGHT [OUTER] JOIN

RIGHT OUTER JOIN 是后面的表為基礎,與LEFT OUTER JOIN用法類似。這里不介紹了。

5. UNION 與 UNION ALL

UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
注意,a。 UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。

    b。每條 SELECT 語句中的列的順序必須相同

        c。UNION 只選取記錄,每一行的數據都是不一樣的。而UNION ALL會列出所有記錄,重復的也會列出來

   union                  

 

  union  all

(1) SELECT name FROM TableA UNION SELECT name FROM TableB

 

(3) 注意:

SELECT * FROM TableA UNION SELECT * FROM TableB

由於 id 1 Pirate   與 id 2 Pirate 並不相同,不合並

 

  還需要注意的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:

       SELECT * FROM TableA CROSS JOIN TableB         這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,

  一般來說,我們很少用到這個語法。但是我們得小心,如果是使用嵌套的select語句,再加上系統對SQL都會產生笛卡爾乘積然再做過濾。這是對於性能來說是非常危險的,尤其是表很大的時候。 

 

從這里我們看出 

SELECT    選擇的是從‘結果集1’中取得某幾列。

FROM      是從 哪些 ‘數據源’中獲取數據,而這些數據源是可以通過各種JOIN進行挑選的。

WHERE   再加上where 從 select出的‘結果集2’ 中限制某些數據

LIMIT   進而限制挑選,

GROUP   可以重新挑選組合集合。

ORDER BY進行結果的排序等。

 

說到底,SQL是對集合的獲取。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM