轉自簾卷西風的專欄(http://blog.csdn.net/ljxfblog)
https://blog.csdn.net/ljxfblog/article/details/52066006
Union
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
//聯合兩個表,沒有重復 SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
- 1
- 2
- 3
- 4
數據源:
結果:
默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。
另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
//聯合兩個表,允許重復
SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA
- 1
- 2
- 3
- 4
結果:
JOIN
有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。
數據庫中的表可通過鍵將彼此聯系起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重復每個表中的所有數據的情況下,把表間的數據交叉捆綁在一起。
數據源:
Persion表:
Orders表:
//使用連表查詢
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P //使用join查詢 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
結果:
不同的 SQL JOIN
除了我們在上面的例子中使用的 INNER JOIN(內連接),JOIN默認使用內連接,可以省略INNER。 我們還可以使用其他幾種連接。
下面列出了您可以使用的 JOIN 類型,以及它們之間的差異。
- JOIN: 如果表中有至少一個匹配,則返回行(INNER JOIN 與 JOIN)
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN: 只要其中一個表中存在匹配,就返回行
LEFT JOIN
//使用left join查詢,只要左表有匹配的條件,就會生成一行,右表的列值為空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- 1
- 2
- 3
- 4
- 5
- 6
結果:
RIGHT JOIN
//使用right join查詢,只要右表有匹配的條件,就會生成一行,左表的列值為空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- 1
- 2
- 3
- 4
- 5
- 6
結果:
FULL JOIN
//使用full join查詢,只要其中一個表中存在匹配,就會生成一行,另一個表的列值為空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
- 1
- 2
- 3
- 4
- 5
- 6
結果:
多表連接
有時候會遇到需要多個表連接的情況,只要遵守以下規則就可以輕松的應對多表連接的情況了。
- 在可以指定一個表名的任何地方,都可以指定一個括號括起來的join子句。
- 在兩個表的一個完整join語句出現的任何一個地方,我們都可以只用一個表名來代替它。所謂“兩個表的一個完整join語句”也即“join子句”,就是指如“A join B on A.a= B.b”這樣一個完整的句子。
比如:欲連接ABCDE五個表
//A: 可以這樣:
Select * from A inner join((( B inner join C on B.b = C.c) inner join D on B.b = D.d) inner join E on D.d = E.e) on A.a = E.e //B: 也可以這樣: select * from ((( A inner join B on A.a = B.b) inner join C on C.c = A.a) inner join D on D.d = C.c) inner join E on E.e = D.d //C: 也可以這樣: select * from A inner join B on A.a = B.b inner join C on C.c = A.a inner join D on D.d = C.c inner join E on E.e = D.d
- //A: 可以這樣: Select * from A inner join((( B inner join C on B.b = C.c) inner join D on B.b = D.d) inner join E on D.d = E.e) on A.a = E.e //B: 也可以這樣: select * from ((( A inner join B on A.a = B.b) inner join C on C.c = A.a) inner join D on D.d = C.c) inner join E on E.e = D.d //C: 也可以這樣: select * from A inner join B on A.a = B.b inner join C on C.c = A.a inner join D on D.d = C.c inner join E on E.e = D.d
我們可以先把A和B連接起來,然后將結果與C連接,當然,如果C只和B相關而不和A相關的話,我們也可以先把B和C連接起來,結果再與A連接,只要保持關系是正確的,你可以以任意方式來定義嵌套的join。