VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
UNION は結果を縦に積み重ね、
結果を長くします。2 つのクエリが同じ形の行を生成し、それらを 1 つのリストに
したいときに使います。
始める前に、mysql -u root -p sakila でクライアントを開いてください。
UNION の仕組み
COLUMN_LIST を欲しい列に、FIRST_TABLE と SECOND_TABLE を読むテーブルに
置き換えます。
2 つのクエリは同じ数の列を返さなければならず、サーバーはそれらの列を名前では
なく位置で対応付けます。
UNION は重複行を取り除きます。UNION ALL は重複行を保持し、何も比較する
必要がないため高速です。
例
- UNION は重複を取り除く
ここでは両方の部分が同じクエリなので、2 番目のすべての行は 1 番目のいずれかの
行の重複です。
UNION は結合した結果を 1 回の処理で重複排除するため、
一方の部分の内側での繰り返しも、両部分にまたがる繰り返しと同じ扱いになります。
答えは、同じ列に対する SELECT DISTINCT と
一致します。
- UNION ALL は重複を保持する
UNION ALL を使ってください。
- 異なるテーブルの行を積み重ねる
これこそが UNION の本来の用途です。同じ種類のものを保持する 2 つの
テーブルです。リテラルの列が、各行がどちらの部分から来たかを示します。
UNION は順序を約束しない
どちらの部分も、まとまって届くことも、先に届くことも保証されません。サーバーは プランが生成した順序のまま行を返すため、2 つの同一のクエリのUNION ALL は
交互に混ざることがあります。末尾の ORDER BY が順序を固定する唯一の方法で、
これは LIMIT や GROUP BY の場合と
同じです。
各部分の列数は同じでなければならない
ORDER BY は結果全体に適用される
末尾のORDER BY は、最後のクエリではなく、結合された行を並べ替えます。1 番目の
部分のエイリアスを指定してください。それが結果の列の名前だからです。
ORDER BY と LIMIT をかっこの中に置きます。
まとめ
- 2 つのクエリの行を 1 つの結果に積み重ねるには
UNIONを使います。 UNIONは重複を取り除き、UNION ALLは重複を保持すると考えてください。- 重複がないと分かっているときは
UNION ALLを優先します。行う作業が少ないためです。 - 両方の部分の列数を同じにします。そうでなければ
ERROR 1222になります。 - 見出しは 1 番目のクエリから来て、末尾の
ORDER BYがすべてを並べ替えると考えてください。
関連項目
- SELECT DISTINCT — 1 つのクエリから重複を取り除く
- 結合の仕組み — 代わりにテーブルを横に並べて結合する
- サブクエリ — 積み重ねるのではなく値として使うクエリ