UNION と UNION ALL の違い
どっちがどっちだかよく忘れてしまうので、まとめます。
結論から言うと、UNION ALL は重複行を許しますが、UNION は除外します。
UNIONとは
UNION は2つのテーブルを結合して1つのテーブルを生成します。結合するテーブルは、次の条件を満たす必要があります。
- 2つのテーブルが同じ列数であること
- 同じ位置にある列は、同じデータ型であること
UNION と UNION ALL の違い
UNION と UNION ALL の違いは、重複行の扱いです。
UNION は、重複行を除外します。対して、UNION ALL は重複行を許します。そのため、重複行を含むテーブルに対しての UNION と UNION ALL では、取得結果が変わります。
また、UNION では重複行を除外する分、処理が遅くなる可能性があります。重複するデータがないことが予め分かっている場合や、重複を気にしない場合は、UNION ALL を使用するほうが良いです。
例
2つの集合A、Bに対して UNION と UNION ALL を使ってみましょう。
Aは、1 ~ 10 までの整数のうち、2の倍数からなります。
SELECT i FROM (VALUES (2), (4), (6), (8), (10)) AS A(i)
i |
---|
2 |
4 |
6 |
8 |
10 |
Bは、1 ~ 10 までの整数のうち、フィボナッチ数列を満たす数からなります。
SELECT i FROM (VALUES (1), (1), (2), (3), (5), (8)) AS B(i)
i |
---|
1 |
1 |
2 |
3 |
5 |
8 |
まずは、UNION を使ってみましょう。
-- A SELECT i FROM (VALUES (2), (4), (6), (8), (10)) AS A(i) UNION -- B SELECT i FROM (VALUES (1), (1), (2), (3), (5), (8)) AS B(i)
i |
---|
1 |
2 |
3 |
4 |
5 |
6 |
8 |
10 |
図は分かりやすいように結果をソートしています。
結果を見てわかるように、AとBの間で重複している2と8、Aの中で重複している1が、それぞれ1行のみ出力されています。
続いて、UNION ALL を使ってみましょう。
-- A SELECT i FROM (VALUES (2), (4), (6), (8), (10)) AS A(i) UNION -- B SELECT i FROM (VALUES (1), (1), (2), (3), (5), (8)) AS B(i)
i |
---|
1 |
1 |
2 |
2 |
3 |
4 |
5 |
6 |
8 |
8 |
10 |
重複している行がそのまま出力されています。