pontz_rwのブログ

プログラミング等の備忘録

UNION と UNION ALL の違い

どっちがどっちだかよく忘れてしまうので、まとめます。

結論から言うと、UNION ALL は重複行を許しますが、UNION は除外します。

UNIONとは

UNION は2つのテーブルを結合して1つのテーブルを生成します。結合するテーブルは、次の条件を満たす必要があります。

  1. 2つのテーブルが同じ列数であること
  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

重複している行がそのまま出力されています。