2009-05-16 82 views
2

比方說,我有兩個或更多的表充滿用戶,我想在同一個查詢中從這些表中檢索所有用戶。如何從同一查詢中的不同表中檢索相似的行?

表共享一些列,那些具有相同名稱的列是我試圖檢索的列。

喜歡的東西:

SELECT name, age FROM users1; 
SELECT name, age FROM users2; 
etc. 

注意:這只是一個例子,而不是真正的問題。我無法將這些表合併爲一個。

回答

7

您可以使用UNION

UNION用於將結果從多個SELECT語句合併成一個結果集。

第一個SELECT語句的列名用作返回結果的列名。在每個SELECT語句的相應位置列出的選定列應具有相同的數據類型。

一個例子:

mysql> SELECT 1 as ColumnA,'a' as ColumnB 
    -> UNION 
    -> SELECT 2, 'b' 
    -> UNION 
    -> SELECT 3, 'c'; 
+---------+---------+ 
| ColumnA | ColumnB | 
+---------+---------+ 
|  1 | a  | 
|  2 | b  | 
|  3 | c  | 
+---------+---------+ 
3 rows in set (0.05 sec) 

還要注意:

工會的默認行爲是重複的行從結果中刪除。可選的DISTINCT關鍵字除缺省值外沒有其他作用,因爲它還指定刪除重複行。使用可選的ALL關鍵字,不會發生重複行刪除,結果包括所有SELECT語句中的所有匹配行。

一個例子:

mysql> SELECT 1 as x 
    -> UNION 
    -> SELECT 1; 
+---+ 
| x | 
+---+ 
| 1 | 
+---+ 
1 row in set (0.00 sec) 

mysql> SELECT 1 as x 
    -> UNION ALL 
    -> SELECT 1; 
+---+ 
| x | 
+---+ 
| 1 | 
| 1 | 
+---+ 
2 rows in set (0.00 sec) 
1

嘗試

SELECT name, age FROM users1 
UNION 
SELECT name, age FROM users2 
2

您可以使用unionunion all,這取決於你想要什麼樣的行爲:

select name, age from users1 
union 
select name, age from users2 
union 
select name, age from users3 

或:

select name, age from users1 
union all 
select name, age from users2 
union all 
select name, age from users3 

區別在於union刪除重複項,而union all沒有。

如果您知道沒有重複項,則應該使用union all,以便數據庫不必進行額外的工作來嘗試查找重複項。

0

還注意到'union all'會比'union'快得多。

相關問題