Union
CoddyのSQLジャーニー「基礎」セクションの一部 — レッスン 48/72。
ユニオンはジョインとは異なります。ジョインは条件を使用してテーブルを結合しますが、ユニオンは2つのテーブルを縦に追加するだけです。UNIONを使用するには、次のように書きます:
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2両方のセレクトは以下のルールを守る必要があります:
- フィールドの数が一致する必要があります
- 順序が重要です
- 同じ位置にある列はデータ型を一致させる必要があります
例えば、以下のテーブルがあるとします:
germany_people
| id | name |
| 1 | Lena |
| 2 | Leonie |
england_people
| id | name |
| 1 | George |
| 2 | Lena |
問題:私たちが持っているすべての名前を1つの大きな表にまとめたい。
SELECT name from germany_people
UNION
SELECT name from england_people結果:
| name |
| Lena |
| Leonie |
| George |
UNION は 重複しない 値のみを返しますが、UNION ALL はすべてのレコードをそのまま返します:
SELECT name from germany_people
UNION ALL
SELECT name from england_people結果:
| 名前 |
| Lena |
| Leonie |
| George |
| Lena |
また、UNION ALL をサブクエリで囲むことで、GROUP BY、集計関数、および ORDER BY と組み合わせることもできます。たとえば、両方のテーブルにわたって各名前が何回出現するかをカウントする場合:
SELECT name, COUNT(*) AS total
FROM (
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people
) AS all_people
GROUP BY name
ORDER BY total DESC結果:
| 名前 | 合計 |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
ここで、UNION ALL はすべての行(重複を含む)を保持するため、COUNT が実際の出現回数を反映します。外側のクエリは次に、結合された結果をグループ化して並べ替えます。
チャレンジ
簡単利用可能なテーブルと列:
<strong>sales_2009</strong>:<strong>product_id</strong>,<strong>quantity_sold</strong><strong>sales_2010</strong>:<strong>product_id</strong>,<strong>quantity_sold</strong><strong>sales_2011</strong>:<strong>product_id</strong>,<strong>quantity_sold</strong>
販売テーブルが 3 つあります。
すべてのテーブルをまとめて、各製品の販売合計を求めなさい。
結果には product_id と総販売量を含めなさい。
この列を total_sales と名付けなさい。
総販売量で降順にソートしなさい。
チートシート
UNION はテーブルを縦方向に積み重ねて結合します。ジョインとは異なり、UNION は条件を使用せず、単にテーブルを一つ上に追加します。
基本的な UNION 構文:
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2UNION のルール:
- フィールドの数が等しくなければならない
- 順序が重要です
- 同じ位置の列はデータ型が一致しなければならない
UNION と UNION ALL:
UNIONは重複を除いたユニークな値のみを返しますUNION ALLは重複を含むすべてのレコードを返します
SELECT name FROM germany_people
UNION
SELECT name FROM england_peopleSELECT name FROM germany_people
UNION ALL
SELECT name FROM england_peopleUNION ALL をサブクエリ内で使用し、結合結果に対して GROUP BY、ORDER BY、および集計関数を適用できます:
SELECT name, COUNT(*) AS total
FROM (
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people
) AS all_people
GROUP BY name
ORDER BY total DESCこれにより、両方のテーブルにわたって各名前が何回出現するかを、重複を含めてカウントします。
自分で試してみよう
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
4More Keywords
The IN keywordThe BETWEEN keywordThe LIKE keywordThe AS keywordRecap - Cellphone Models2Conditions
Conditions BasicsThe AND keywordThe OR keywordThe NOT keywordMultiple Conditions CombinedParenthesisBooleans5Arithmetic Operations
Mathematical OperatorsMathematical ColumnsThe Modulo OperationThe ROUND() Function3Specific Return Format
Null valuesSort Results Part 1Sort Results Part 2Recap - Cyber Security FirmLimit number of recordsRecap - Vehicle Factory6Intro Challenges
Recap - Parliamentary ElectionRecap - Police Criminal ArrestRecap - Bar Beverage ContainerRecap - Engineer new columns