mysql union comprehensive tutorial with union examples
このチュートリアルでは、MySQL UNIONコマンド、そのタイプ、UnionとUnion All、および2つ以上のクエリからのデータを組み合わせる例について説明します。
MySQL UNIONは、複数のSELECTクエリの結果を1つの結果セットに結合するために使用されます。 SELECTクエリにすべての複雑なクエリ/操作を含め、他のSELECTステートメントでUNIONを実行して、結合された結果を生成することもできます。
機能要件の例は_________です。
UNIONステートメントのデフォルトの特性は、結果の行のセットから重複するエントリまたは行を削除することですが、UNIONALL句を使用して重複するレコードをフェッチする方法も提供します。
学習内容:
集合論を通してUNIONを理解する
UNIONの操作は、集合論の原理から非常によく理解できます。
以下のセットで表されるテーブルAとBがあり、それらに重複するデータがあるとします(または、まったく関係がない場合もあります)–UNIONには両方のテーブルのデータの組み合わせが含まれます。
セットAとBにいくつかの共通要素がある例を見てみましょう。 UNIONには、重複する値を省略して、セットAおよびBのすべての値が含まれます。
では、セットAとBが互いに素であり、共通の要素が含まれていない場合はどうなるでしょうか。ここでも、UNIONは同じ結果を返します。
セット間に重複する要素があり、重複する値を結果セットにも表示するシナリオについて説明します。
MySQLは、次の画像に示すように、UNIONALLオプションを使用してこれを行う方法を提供します。
MySQLUNIONはどのような問題を解決しますか
MySQL UNIONは、2つ以上のテーブルに類似したデータがあり、個々のテーブルに対してSELECTステートメントを実行するのではなく、両方のテーブルに含まれるデータの結合ビューを表示する場合に使用されます。
例えば - 2つのテーブルがあるとします– 社員 そして 学生。 そして、あなたはすべての従業員と学生の名前、年齢、生年月日を知りたいだけの個人データベースに取り組んでいます。
UNIONがない場合は、両方のテーブルに対して個別のSELECTクエリを実行してから、取得した結果セットを使用して目的の計算を実行する必要があります。
MySQLUNION構文
以下のクエリは、2つまたは3つ以上のSELECTステートメントのUNIONを返します。
SELECT {column1}, {column2} FROM {table1} UNION (ALL | DISTINCT) SELECT {column3}, {column4} FROM {table2} UNION (ALL | DISTINCT) SELECT ...
構文のさまざまなコンポーネントを見てみましょう
- 複数のSELECTクエリをUNIONと組み合わせて、結果の行セットを取得できることがわかります。
- 列名とデータ型:結合する列は同じまたは互換性のあるデータ型である必要があることを理解することが重要です。 例えば: column1をSTRINGとして使用している場合、column3もSTRING(またはSTRING互換)である必要があります。
- 列の名前と位置は、UNIONクエリの最初のSELECTステートメントから決定されます。 たとえば、上記の構文では次のようになります。 column1とcolumn2は、結果セットのヘッダー列として名前が付けられ、column3とcolumn4の値はそれぞれcolumn1とcolumn2にマップされます。
- UNIONクエリの結果は、デフォルトで重複エントリを削除します。 例えば、 この場合、完全に一致し、column1とcolumn2の値が同じである重複エントリがある場合、それらの行は結果セットから省略されます。
複製が必要な場合は、UNIONとともに「ALL」オプションを使用できます。
の使用法 DISTINCT デフォルトで暗黙的に示されます。読みやすくするために、明示的に指定することもできます。
UNIONクエリのサンプル例を見てみましょう。
従業員と学生の2つのテーブルがあり、それぞれに個人情報があるとします。
CREATE TABLE employee (id INT PRIMARY KEY, name VARCHAR(100), age INT, dob DATE, department VARCHAR(100)); CREATE TABLE student (id INT PRIMARY KEY, name VARCHAR(100), age INT, dob DATE, department VARCHAR(100));
次に、以下に示すように、これらのテーブルの両方にダミーデータを入力します。
INSERT INTO employee values (1,'Darren', 32, '1988-05-20', 'ENGINEERING'), (2,'Abhishek', 28, '1992-05-20', 'ACCOUNTING'), (3,'Amit', 30, '1990-09-20', 'ENGINEERING'), (4,'Steven', 40, '1980-05-21', 'HUMAN RESOURCES'), (5,'Kartik', 20, '2000-05-12', 'TRAINEE'); ---------------------------------------------- INSERT INTO student values (1,'Akash', 22, '1998-05-17', 'COMPUTER'), (2,'Ian', 26, '1994-06-18', 'COMPUTER'), (3,'Shirley', 19, '2001-11-20', 'MECHANICAL'), (4,'Joana', 21, '1999-05-21', 'ELECTRONICS'), (5,'Kartik', 20, '2000-05-12', 'COMPUTER');
上記のように、名前、年齢、生年月日が同じ属性の行を意図的に追加しました。
UNIONコマンドを使用して、これら2つのテーブルのデータを組み合わせる方法を見てみましょう。両方のテーブルからユーザー名と年齢をクエリします。
シンプルなUNION
クエリ:
SELECT name, age FROM employee UNION SELECT name, age FROM student;
結果に9つのレコードが表示されます(これは、上記のクエリで重複するエントリが省略されていることを意味します)。
出力:
名前 | 年齢 |
---|---|
イアン | 26 |
ダレン | 32 |
アビシェク | 28 |
アミット | 30 |
スティーブン | 40 |
Kartik | 20 |
Akash | 22 |
シャーリー | 19 |
ジョアナ | 21 |
UNIONとUNIONALL
UNIONをALL句とともに使用すると、重複するエントリも確実に表示されます。
クエリ:
SELECT name, age FROM employee UNION ALL SELECT name, age FROM student;
出力:
名前 | 年齢 |
---|---|
イアン | 26 |
ダレン | 32 |
アビシェク | 28 |
アミット | 30 |
スティーブン | 40 |
Kartik | 20 |
Akash | 22 |
シャーリー | 19 |
ジョアナ | 21 |
Kartik | 20 |
状態のあるユニオン
30歳未満の従業員と25歳未満の学生のデータが必要な条件をSELECTステートメントに追加しましょう。
クエリ:
SELECT name, age FROM employee where age <30 UNION SELECT name, age FROM student where age < 25;
出力:
名前 | 年齢 |
---|---|
アミット | 30 |
アビシェク | 28 |
Kartik | 20 |
Akash | 22 |
シャーリー | 19 |
ジョアナ | 21 |
上記のように、結果セットには、検証された個々のSELECT条件を組み合わせた結果が含まれています。
UNION結果の注文
UNIONクエリの結果は、デフォルトでは順序付けされていません。
結果のセットに存在する列による順序付けを課すために、UNIONコマンドの最後にORDERBY句を指定できます。
同じ従業員/学生データを使用して、UNIONの結果を年齢の昇順で並べ替えましょう。
SELECT name, age FROM employee UNION SELECT name, age FROM student ORDER BY age asc
出力:
名前 | 年齢 |
---|---|
シャーリー | 19 |
Kartik | 20 |
ジョアナ | 21 |
Akash | 22 |
イアン | 26 |
アビシェク | 28 |
ダレン | 32 |
スティーブン | 40 |
上記の結果セットは、年齢の値の昇順で並べられています。列エイリアスを使用して、ORDERBY句の列を参照することもできます。
例えば: –以下のようなクエリでも、同じ結果が得られます。
SELECT name as customer_name, age as customer_age FROM employee UNION SELECT name, age FROM student ORDER BY customer_age asc
列名の代わりに列の位置を指定するだけで、ORDERBY句を使用する別の方法があります。
例えば: 上記のUNIONクエリでは、名前と年齢を選択しています。これは、これらの列がそれぞれ1と2の位置にあることを意味します。
したがって、年齢で注文するには、実際の列名の代わりに位置を指定するだけです。
したがって、以下のクエリでも同じ結果が得られます。
SELECT name, age FROM employee UNION SELECT name, age FROM student ORDER BY 2 asc
MySQLUNIONとUNIONALL
MySQLはUNIONの2つのバリアントを提供します。 UNION DISTINCT そして UNION ALL
特に明記されていない場合でも、デフォルトではDISTINCTが暗黙指定されていることに注意してください。
両者の主な違いは、UNION ALLでは重複行を結合して返すこともできるのに対し、UNIONは結合された行を返すだけで重複を削除できることです。
次の表で詳細を説明します。
パラメータ | 連合 | UNION ALL |
---|---|---|
定義 | UNIONDISTINCTと同等です-結果を返すときにデータの重複行を無視します | 重複を含むすべての行を返します |
構文 | SELECT {columnList} FROM {table1} 連合 SELECT {columnList} FROM {table2} | SELECT {columnList} FROM {table1} UNION ALL SELECT {columnList} FROM {table2} |
データ要件 | 結合されるデータは同様のデータ型である必要があり、複数のテーブルからフェッチする場合は同じ順序でフェッチする必要があります | UNIONと同じ |
よくある質問
Q#1)UnionはJOINよりも高速ですか?
回答: UNIONとJOINは、実際には2つの異なる目的で使用されます。
技術的に言えば、UNIONは個々のSELECTステートメントからのデータの行を連結するだけなので、UNIONはJOINよりもはるかに高速です(特に大きなデータセットの場合)。
Q#2)UNION ALL演算子とは何ですか?
回答: UNIONと同様に、UNION ALL演算子も2つのSELECTクエリ間でUNIONを返しますが、違いは、重複する行/エントリも含まれることです。
Q#3)UNIONとJOINの違いは何ですか?
回答: UNIONとJOINの両方を使用して、2つ以上のテーブルのデータを結合します。ただし、取得される結果セットとデータのフェッチ方法には大きな違いがあります。
JOINとUNIONの類似点と相違点を以下の表に示します。
連合 | 参加する |
---|---|
複数のテーブルのデータを結合します | 複数のテーブルのデータを結合します |
データを照合または結合するために特定の条件は必要ありません | JOINは、結果セットに含まれるデータを検証するために必要なJOIN条件で機能します |
異なるテーブルのデータは、結果セットの異なる行として取得されます | 異なるテーブルのデータは単一の行に結合されます。たとえば、結果セットの行には、JOIN条件とSELECTクエリに応じて、テーブル1の2列、テーブル2の3列などが含まれる場合があります。 |
UNIONはシンプルでわかりやすい | 結合には複雑な条件が必要であり、必要に応じて、INNER / OUTERなどの複数のタイプの結合を使用できます。 |
結論
このチュートリアルでは、MySQLUNIONを使用して2つ以上のSELECTステートメントからのデータを結合する方法について学習しました。
UNIONステートメントは、さまざまなテーブルの大規模なセットから類似したデータを照合し、結合されたデータに対して分析を実行するのに非常に役立ちます。
UNIONコマンドは、重複レコードのフェッチも可能にするALL句もサポートしています。