以 w3schools
給的這個範例來說
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
Edit the SQL Statement
SELECT City, Country FROM Customers
WHERE Country='Germany'
這個部分會顯示十一列德國城市的資料
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
而這個部分會顯示三列德國城市的資料
然而當我們在兩個SELECT
中間加上UNION ALL
的話
最終顯示的資料就會是十四列,也就是兩個SELECT
結果的相加
也意味者即使當中有重複的資料,也會被列出來,而這個範例也是如此
這個部分詳細可以直接去玩玩看,就可以知道是哪一些資料有重複
w3school_SQL_TryEditorv1.6
同樣的兩個SQL
但是換成UNION
呢?
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
相較於UNION ALL
最終顯示的資料會是十三列,如果有點進去玩玩看的話可以發現其中Berlin
這個城市兩個資料表都有,屬於重複Customers
這個資料表中選出的有11列,Suppliers
的有3列
因此最後顯示的列數會是11+3-1 = 13
列,因為要不重複的資料,如果有重複的話,那筆資料只顯示一筆
前面的SQL
考慮的是城市,因此最終如果同樣的城市顯示兩筆的話感覺怪怪的,加上前面又沒有其他可以用於判斷這個資料表是幹嘛用的欄位名稱,因此重複的資料就只顯示一筆就好
不然再資料型別相似及SELECT
語句下的一模一樣的情況下,幾乎都是將結果合併
下面的結果接續上面的結果,如這個範例
SELECT 'Customer' AS Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers
91+29 = 120列
這個範例顯示的結果是「列出所有在資料庫中的客戶及供應商的聯絡人名字、城市及國家」
筆記來源:SQL UNION Operator