LEFT JOIN
會將聯結關系中左右兩個資料表。左邊資料表在經過「聯結」後,不管是否存在右邊資料表資料與之對應,仍然會將資料全部列出,相關范例如下:
舊式WHERE「聯結」語法則以WHERE子句中的「*=」表示「左聯結(left join)」。
舊式 WHERE 語法
代碼如下 復制代碼SELECT C.First_Name, C.Last_Name, O.Order_ID FROM Customer AS C, Order AS O WHERE C.Customer_ID *= O.Order_ID
這種語法經過MySQL的發展小組決定在MySQL不支援。他們所持的理由有兩個:一是此類 WHERE「左聯結」鮮少使用,如果要用,可以使用標??NSI-92的新式「LEFT JOIN」語法;另一個原因是是,MySQL發展經費及相關人員發展時間有限,此類少用的語法,似乎不需要浪費金錢與人力來做。
新式 JOIN 語法一
代碼如下 復制代碼SELECT C.First_Name, C.Last_Name, O.Order_Id FORM Customer AS C LEFT JOIN Order AS O ON C.Customer_ID = O.Customer_ID
這裡Customer資料表中所有紀錄都會列出,經過JOIN後,如果它的紀錄在Order中找不到對應紀錄的話,則會以NULL值代替。
ANSI-92 的 LEFT JOIN 相容語法還有另一種表達方式是利用 USING。上例可以改寫為:
新式 JOIN 語法二
代碼如下 復制代碼SELECT C.First_Name, C.Last_Name, O.Orders_ID FORM Customers AS C LEFT JOIN Orders AS O USING Customer_ID
這裡使用 USING Customer_ID 取代 C.Customer_ID = O.Customer_ID。這種寫法也可參考看看。
NATURAL LEFT JOIN
其實就是 LEFT JOIN,差?e是所有符合「聯結」關系的字段都自動選取,不需要在用 USING 或是 ON 之類的子句來特?e注明,所以上述 LEFT JOIN 范例又可改寫為:
新式 JOIN 語法
代碼如下 復制代碼SELECT C.First_Name, C.Last_Name, O.Orders_ID FORM Customers AS C NATURAL LEFT JOIN Orders AS O
由於Customers和Orders中都有Customer_ID,經由NATURAL LEFT JOIN關鍵字之後,便自動 LEFT JOIN 起來。這種「聯結」用法不常見,所以要用的話,也跟 LEFT JOIN 一樣,只有支援標?實?NSI-92語法。
有 RIGHT JOIN 嗎?
幾乎每一種 RDMS 都有 RIGHT JOIN 這種語法,但是 MySQL 沒有支援 RIGHT JOIN 語法,不支援的原因很簡單,因為把 LEFT JOIN 的資料表對調再使用 LEFT JOIN 就可以得到 RIGHT JOIN 的效果,例如:
代碼如下 復制代碼SELECT C.FIIRST_NAME FROM CUSTOMERS AS C LEFT JOIN ORDERS AS O ON C_CUSTOMER_ID=O.CUSTOMER_ID;
現在要取得 RIGHT JOIN 的效果只要兩個資料表對調:
代碼如下 復制代碼SELECT C.FIIRST_NAME FROM ORDERS AS O LEFT JOIN CUSTOMERS AS C ON C_CUSTOMER_ID=O.CUSTOMER_ID;
因此實在沒有必要在 MySQL 中做一個 RIGHT JOIN,做一個 RIGHT JOIN 甚至還會降低資料庫的效能。
下面是例子分析
表A記錄如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表B記錄如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
創建這兩個表SQL語句如下:
CREATE TABLE a
aID int( 1 ) AUTO_INCREMENT PRIMARY KEY ,
aNum char( 20 )
)
CREATE TABLE b(
bID int( 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
bName char( 20 )
)
INSERT INTO a
VALUES ( 1, ‘a20050111′ ) , ( 2, ‘a20050112′ ) , ( 3, ‘a20050113′ ) , ( 4, ‘a20050114′ ) , ( 5, ‘a20050115′ ) ;
INSERT INTO b
VALUES ( 1, ‘ 2006032401′ ) , ( 2, ’2006032402′ ) , ( 3, ’2006032403′ ) , ( 4, ’2006032404′ ) , ( 8, ’2006032408′ ) ;
實驗如下:
1.left join(左聯接)
sql語句如下:
SELECT * FROM a
LEFT JOIN b
ON a.aID =b.bID
結果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影響的行數為 5 行)
結果說明:
left join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為准的.
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中為: A.aID = B.bID).
B表記錄不足的地方均為NULL.
2.right join(右聯接)
sql語句如下:
代碼如下 復制代碼 SELECT * FROM a結果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影響的行數為 5 行)
結果說明:
仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充.
3.inner join(相等聯接或內聯接)
sql語句如下:
代碼如下 復制代碼 SELECT * FROM a等同於以下SQL句:
代碼如下 復制代碼 SELECT *結果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
結果說明:
很明顯,這裡只顯示出了 A.aID = B.bID的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄.
LEFT JOIN操作用於在任何的 FROM 子句中,
組合來源表的記錄。使用 LEFT JOIN 運算來創建一個左邊外部聯接。左邊外部聯接將包含了從第一個(左邊)開始的兩個表中的全部記錄,即
使在第二個(右邊)表中並沒有相符值的記錄。
語法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
說明:table1, table2參數用於指定要將記錄組合的表的名稱。
field1, field2參數指定被聯接的字段的名稱。且這些字段必須有相同的數據類型及包含相同類型的數據,但它們不需要有相同的
名稱。
compopr參數指定關系比較運算符:”=”, “<", ">“, “<=", ">=” 或 “<>“。
如果在INNER JOIN操作中要聯接包含Memo 數據類型或 OLE Object 數據類型數據的字段,將會發生錯誤