MySQL UNION – 完全なチュートリアル

⚡ スマートサマリー

MySQL UNIONは、2つ以上のSELECTクエリの結果を1つの統合された結果セットに結合します。この説明では、UNIONを有効にするための列ルール、UNION DISTINCTとUNION ALLの違い、およびmyflixdbデータベースに対して実行した具体的な例について解説します。

  • 🔗 主な目的: UNIONは、複数のSELECTクエリによって返された行を、1つの結果セットに積み重ねます。つまり、クエリごとに縦に並べられます。
  • 📐 列ルール: すべてのSELECT文は、同じ数の列を、同じ順序で、互換性のあるデータ型で返さなければなりません。
  • 🧹 ユニオンディスティンクト: 重複行は削除され、一意の行のみが返されます。これが動作です。 MySQL デフォルトで適用されます。
  • 📚 全員で協力しよう: 重複行も含め、すべての行が返されるため、重複排除処理が不要となり、処理速度が向上します。
  • 🏷️ 列名: 結果セットの列名は最初のSELECT文から取得されるため、エイリアスはそのクエリに含める必要があります。
  • 🛠️ 典型的な使用法: 同じ種類のレコードを保持する2つのテーブルを統合し、統合後の出力に重複する行を含めないようにする。

MySQL 連合 Operaタ

労働組合とは何か MySQL?

連合   MySQL 複数のSELECTクエリの結果を結合して、1つの結果セットを作成する演算子です。2番目のクエリによって返された行は、1番目のクエリによって返された行の下に配置され、2つの別々のリストではなく、1つの縦方向のリストが作成されます。

この方法が機能するための唯一の条件は、結合する必要のあるすべてのSELECTクエリの列数が同じであることです。

次のような2つの表があると仮定します。

MySQL 連合MySQL 連合

どちらのテーブルにも同じ種類の列が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つのルールが適用されます。

  1. 列数が等しい。 各 SELECTステートメント 同じ数の列を返す必要があります。そうでない場合 MySQL エラー1222が発生します。
  2. 互換性のあるデータ型を同じ順序で並べます。 最初のクエリの1列目は2番目のクエリの1列目と照合されるため、数値は数値と、テキストはテキストと一致するはずです。
  3. 名前は最初のクエリから取得されます。 結果セットの見出しは最初の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

よくあるご質問

UNIONは、あるクエリの行を別のクエリの行の下に積み重ねるため、結果が縦長になります。 登録 関連する行を照合し、それらの列を横に並べることで、結果の幅を広げます。類似する行には UNION を、関連するテーブルには JOIN を使用してください。

1つ置く ORDER BY 最後の SELECT の後に LIMIT 句を挿入します。結合された結果をソートし、最初の SELECT で生成された列名を使用する必要があります。そこに LIMIT 句を挿入した場合も同様に動作します。

エラー1222は、SELECT分岐で返される列数が異なる場合に発生します。各分岐の列数を数え、短い方の分岐にリテラルまたはNULLプレースホルダーを追加して、両側が同じ順序になるようにしてください。

はい。テキストからSQLへの変換アシスタント、組み込みのものも含め MySQL ワークベンチプレーンなリクエストから UNION ステートメントを生成します。モデルは見た目が似ているだけの列を整列させる可能性があるため、列の順序はご自身で確認してください。

重複が不可能な場合は、アシスタントが UNION ALL を提案することがあります。これは処理速度を向上させる一般的な方法です。ただし、最終的な判断はデータに依存するため、重複排除ステップを削除する前に、ブランチが本当に重複しないことを確認してください。