圖解 SQL 各類鏈接查詢之間的區別

 

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

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

 

1.  INNER JOIN性能

select *
from tablea  a join tableb b on a.name = b.name;

 

                inner join 查詢的是交集中的數據測試

其中join的是(inner join)的縮寫spa

 2. FULL [OUTER] JOIN .net

(1)code

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

Full outer join 產生A和B的並集。可是須要注意的是,對於沒有匹配的記錄,則會以null作爲值。排序

可使用IFNULL判斷。io

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

 

 

注:

mysql 5.5並不支持full join

 可是可使用union all 來變相實現,並非很方便

 

 使用一個左鏈接一個右鏈接,而後加上一個union的效果,就與fulljoin的效果同樣了

 

 

(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

 

總結:這個很好用,能夠用來對生產或者測試上的數據進行補數據的操做。mysql可使用以上方法仿full join

 

 

 

3. LEFT [OUTER] JOIN

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

注意:這個可能很經常使用,可是注意B中匹配到了纔有值,沒有匹配到會變成NULL。至關於以table A爲主表,table B爲附表,A表中全部數據全都查詢出來,B表中與A表有相對應數據就顯示,

沒有就制空

 

 

(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會列出全部記錄,重複的也會列出來

 

(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; select *
from tablea,tableb;

 

 

這兩個SQL是同樣的, 這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,

 通常來講,咱們不多用到這個語法。可是咱們得當心,若是是使用嵌套的select語句,再加上系統對SQL都會產生笛卡爾乘積然再作過濾。這是對於性能來講是很是危險的,尤爲是表很大的時候。

這裏咱們看出 

SELECT 選擇的是從‘結果集1’中取得某幾列。 FROM 是從 哪些 ‘數據源’中獲取數據,而這些數據源是能夠經過各類JOIN進行挑選的。 WHERE 再加上where 從 select出的‘結果集2’ 中限制某些數據 LIMIT 進而限制挑選, GROUP 能夠從新挑選組合集合。 ORDER BY進行結果的排序等。

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

相關文章
相關標籤/搜索