關於SQL中Union和Join的用法


轉自簾卷西風的專欄(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。


免責聲明!

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



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