轉載自: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是對集合的獲取。