最終更新日 2018/02/07
UNION も UNION ALL も2つのテーブル(表)を縦にくっつける(ようなイメージの)操作です。
ただし、UNION ALL は重複行を除きませんが、UNION は重複行を除きます。
具体例
UNION ALL はそのままテーブルを縦にくっつけるような操作です。
例えば、
田中 | 男性 | $100$ |
鈴木 | 女性 | $200$ |
というテーブルと、
佐藤 | 男性 | $300$ |
鈴木 | 女性 | $200$ |
というテーブルを UNION ALLすると、
田中 | 男性 | $100$ |
鈴木 | 女性 | $200$ |
佐藤 | 男性 | $300$ |
鈴木 | 女性 | $200$ |
のようになります。
一方 UNION はくっつけるときに重複行を除きます。
例えば、上の例では「鈴木、女性、$200$」という行が重複しているので、UNION の結果は
田中 | 男性 | $100$ |
鈴木 | 女性 | $200$ |
佐藤 | 男性 | $300$ |
のようになります。
SQL文の例
SELECT * FROM table1の名前
UNION
SELECT * FROM table2の名前
SELECT * FROM table1の名前
UNION ALL
SELECT * FROM table2の名前
のように使います。
注意点
UNION の方が重複行を除くための処理が必要になるので、実行に時間がかかります。
2つのテーブルに重複行が無いときには、UNION と UNION ALL の結果は同じになりますが、処理時間を短縮するために UNION よりも UNION ALL を使った方がよいでしょう。
UNION も UNION ALL も、2つのテーブルの定義(列の数や、各列の型)が同じ場合にしか使えません。
覚え方
UNION と UNION ALL は混同しがちなので、覚え方を紹介します。
UNION ALL は「全部」
つまり重複行も含めて全部出力するようなイメージです。
UNION は(数学で集合を扱う文脈で)和集合を表します。
和集合をイメージするためのベン図を書いてみると、重複を繰り返さない感じが分かるかと思います。
ちなみに、UNION ALLは横持ちテーブルを縦持ちテーブルに変換するときに使えます。
次回は テーブルの横持ちと縦持ちの使い分けと変換 を解説します。