PostgreSQL中UNION的使用
目錄
文件用途
UNION操作符計算所涉及的SELECT語句所返回的行的並集。如果希望結果作為單個記錄集返回,則此運算子非常有用。
詳細資訊
1.UNION的使用
當多個表具有相同的結構但由於某種原因(通常出於效能考慮或存檔目的)而被拆分時,通常需要使用UNION運算子。
使用UNION運算子時,有以下幾個注意事項:
1)作為UNION兩個運算元的SELECT語句必須產生相同數量的列並且對應位置上的列必須具有相容的資料型別。
2)預設情況下,UNION的結果不會包含重複行。
3)除非用圓括號指定計算順序,同一個SELECT語句中的多個UNION操作符會從左至右計算。
4)截至目前,FOR NO KEY UPDATE、FOR UPDATE、FOR SHARE和FOR KEY SHARE不能用於UNION結果或者UNION的任何輸入。
舉例說明UNION運算子的應用場景:
有兩張表,分別包含學生和教授的相關資訊,如下所示:
postgres=# SELECT * FROM students; id | name | major ----+-------+------------------- 1 | Wang | Computer Science 2 | Tang | Civil Engineering 3 | Zhang | English (3 rows)
postgres=# SELECT * FROM professors; id | name | major ----+-------+---------- 1 | Zheng | Japanese 2 | Hao | Music (2 rows) |
要將這兩個表合併在一起,需要執行此查詢:
postgres=# SELECT * FROM students UNION SELECT * FROM professors; id | name | major ----+-------+------------------- 1 | Zheng | Japanese 3 | Zhang | English 1 | Wang | Computer Science 2 | Tang | Civil Engineering 2 | Hao | Music (5 rows) |
注意:執行此查詢,資料將不會以任何特定順序顯示。您可以使用ORDER BY來確保資料按您指定的順序顯示。
2.UNION ALL的使用
前面提到,UNION運算子預設只返回不同的值。如果您希望結果包含所有值,即包括重複值,那麼可以使用UNION ALL。
但是,UNION ALL也不保證生成的結果將按任何特定順序排列。因此,和使用UNION一樣,您需要使用ORDER BY進行排序來確保資料按您指定的順序顯示。
舉例說明UNION ALL的應用場景:
有如下兩張表,其中包含一條重複的記錄:
postgres=# SELECT * FROM club; name | country ----------+--------- Bayern | Germany Dortmund | Germany Bremen | Germany (3 rows)
postgres=# SELECT * FROM champion; name | country -----------+--------- Chelsea | England Barcelona | Spain Bayern | Germany (3 rows) |
如果只是執行UNION操作,那麼結果會如下所示:
postgres=# SELECT * FROM club UNION SELECT * FROM champion; name | country -----------+--------- Bayern | Germany Bremen | Germany Chelsea | England Dortmund | Germany Barcelona | Spain (5 rows) |
這樣會失去一條重複的記錄。如果想要顯示全部的記錄,包括重複的部分,那麼應該用UNION ALL替換UNION。例如:
postgres=# SELECT * FROM club UNION ALL SELECT * FROM champion; name | country -----------+--------- Bayern | Germany Dortmund | Germany Bremen | Germany Chelsea | England Barcelona | Spain Bayern | Germany (6 rows) |
現在結果中就會顯示兩張表中的所有記錄。
注意:UNION ALL的執行速度更快,因為它不必過濾掉重複項。
order by的詳細使用請登入【瀚高技術支援平臺】檢視
https://support.highgo.com/#/index/docContent/05e3936e00a50ebc