こんにちは、オカザキです。
SQLServerにてSQLを書いているときにUNIONとUNION ALLについて自分が勘違いしていた部分がありましたので備忘も兼ねて書いていきます。
UNIONとUNION ALLはどちらもテーブルを統合するというものです。
大きな違いを2点ほど例を交えて説明します。
1.重複行
こちらは様々なサイトで見かける違いです。
UNIONでは問い合わせの結果のレコードに重複している行が存在する場合は1行として結果を出力しています。
UNION ALLでは重複している行が存在した場合も再度その行も結果として出力しています。
UNION
1
2
3
|
SELECT '1','2','3','4'
UNION
SELECT '1','2','3','4'
|
UNION ALL
1
2
3
|
SELECT '1','2','3','4'
UNION ALL
SELECT '1','2','3','4'
|
2.並び順
UNIONとUNION ALLでは結果を出力したときの並び順にも違いがあります。
UNIONではテーブルを統合したあとに並び替えをして結果を出力しています。
UNION ALLではテーブルを統合した順番通りに結果を出力しています。
UNION
1
2
3
4
5
|
SELECT '1','2','3','4'
UNION
SELECT '3','4','5','6'
UNION
SELECT '2','3','4','5'
|
UNION ALL
1
2
3
4
5
|
SELECT '1','2','3','4'
UNION ALL
SELECT '3','4','5','6'
UNION ALL
SELECT '2','3','4','5'
|
マイクロソフトのサイトによると、UNION時にORDER BY句で照合順序を指定しなかった場合、SQLServerインストール時に選択した照合順序で変わってくるようです。
UNIONで勝手にソートされることを知らずに、SQLの速度を計ってみたときにUNIONとUNION ALLで返ってくるレコードの並び順が違うことに驚かされてしまいました。
以上です。