MySQL UNION – 完全なチュートリアル
⚡ スマートサマリー
MySQL UNIONは、2つ以上のSELECTクエリの結果を1つの統合された結果セットに結合します。この説明では、UNIONを有効にするための列ルール、UNION DISTINCTとUNION ALLの違い、およびmyflixdbデータベースに対して実行した具体的な例について解説します。
労働組合とは何か MySQL?
連合 MySQL 複数のSELECTクエリの結果を結合して、1つの結果セットを作成する演算子です。2番目のクエリによって返された行は、1番目のクエリによって返された行の下に配置され、2つの別々のリストではなく、1つの縦方向のリストが作成されます。
この方法が機能するための唯一の条件は、結合する必要のあるすべてのSELECTクエリの列数が同じであることです。
次のような2つの表があると仮定します。
どちらのテーブルにも同じ種類の列が2つずつ含まれているため、結合が可能です。以下の例では、まさにこの2つのテーブルを結合しています。
UNIONを使う理由とは?
データベース設計に欠陥があり、同じ目的のために2つの異なるテーブルを使用しているとします。重複レコードを除外しながら、これら2つのテーブルを1つに統合したいとします。ping 新しいテーブルに統合します。このような場合は、UNIONを使用できます。
このオペレーターは、日常的な報告業務にも役立ちます。
- Archivedとライブデータ: 同じ列を共有する現在のテーブルとアーカイブテーブルは、物理的にマージすることなく、まとめてレポートを作成できます。
- 複数の情報源から得られた一つの報告書: 会員数や映画作品数、あるいは2つの地域からの売上などを、迅速な監査のために1つの出力にまとめて表示できます。
- 移行チェック: 古いテーブルを削除する前に、古いテーブルと新しいテーブルの行を積み重ねて比較することができます。
UNIONはJOINの代わりにはなりません。UNIONは行の下に行を追加するのに対し、JOINは列の横に列を追加します。この違いによって、タスクに適した演算子が決まります。
MySQL UNION構文とルール
目的が明確になったところで、ステートメントの形式とデータベースが適用するルールを見てみましょう。
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
すべての労働組合には、次の3つのルールが適用されます。
- 列数が等しい。 各 SELECTステートメント 同じ数の列を返す必要があります。そうでない場合 MySQL エラー1222が発生します。
- 互換性のあるデータ型を同じ順序で並べます。 最初のクエリの1列目は2番目のクエリの1列目と照合されるため、数値は数値と、テキストはテキストと一致するはずです。
- 名前は最初のクエリから取得されます。 結果セットの見出しは最初のSELECT文から取得されるため、エイリアスはそこに記述する必要があります。
An ORDER BY または LIMIT 最後に配置される句は、結合された結果に適用され、その1つの分岐には適用されません。また、最初のSELECTによって生成された列名を参照する必要があります。
ユニオン個別 vs ユニオン全体
ルールが確立された今、残る決定事項は、重複する行を残すべきかどうかである。
DISTINCT を使用したテーブルの結合
それでは、DISTINCT を使用して両方のテーブルを結合する UNION クエリを作成しましょう。
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
ここでは重複行が削除され、一意の行のみが返されます。
注意: MySQL 何も指定されていない場合、UNION クエリを実行するときにデフォルトとして DISTINCT 句が使用されます。
ALLを使用してテーブルを結合する
それでは、ALL を使用して両方のテーブルを結合する UNION クエリを作成しましょう。
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
ここではALLを使用しているため、重複する行が含まれています。
この2つの画像を見れば違いは一目瞭然で、下の表にその違いをまとめました。
| 比較のポイント | ユニオンディスティンクト | UNION ALL |
|---|---|---|
| 行を複製する | 結果から削除されました | 結果に残された |
| デフォルトの動作 | はい、何も指定されていない場合に適用されます | いいえ、キーワードALLを記述する必要があります |
| 速度 | 処理速度が遅いため、重複排除処理が必要となる。 | より高速で、行は読み取られると同時に返されます。 |
| 最適な使用例 | マージされたリストには一意の行が含まれている必要があります | すべての行が重要であり、重複は発生しない。 |
💡ヒント: 2つのブランチで重複する行が生成されない場合は、UNION ALLを選択してください。そうすることで、データベースはDISTINCTに必要なソートや比較処理をスキップするため、大規模なテーブルでは顕著なデータ削減効果が得られます。
実例 MySQL ワークベンチ
これまでの例ではサンプルテーブルを使用していましたが、今回は同じクエリを実際のmyflixdbデータベースに対して実行します。実際のデータベースでは、2つのテーブルに全く異なるレコードが格納されています。
myFlixDBでは、 membership_number (NAIST) と full_names メンバーテーブルの列 movie_id (NAIST) と title 映画テーブルの列。どちらのクエリも2つの列を返すため、結合は有効です。
以下のクエリを使用できます。
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
上記のスクリプトを実行すると、 MySQL 作業台 myflixdbに対して実行すると、以下に示すような結果が得られます。下の行は映画のレコードですが、見出しは最初のSELECT文から取得されていることに注意してください。
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |





