Menu
Coddy logo textTech

Union

CoddyのSQLジャーニー「基礎」セクションの一部 — レッスン 48/72。

Union(ユニオン)はJoin(結合)とは異なります。Join(結合)は条件を使用してテーブルを組み合わせますが、Union(ユニオン)は単に2つのテーブルを上下に重ね合わせます。UNIONを使用するには、次のように記述します:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

両方のselect文は、以下のルールに従う必要があります:

  • フィールドの数が等しいこと
  • 順序が重要であること
  • 同じ位置にあるカラムのデータ型が一致していること

例えば、次のようなテーブルがあると仮定しましょう。

germany_people

ID名前
1Lena
2Leonie

england_people

id名前
1ジョージ
2レナ

問題: 手元にあるすべての名前をまとめた1つの大きなテーブルを作成したいとします。

SELECT name from germany_people
UNION
SELECT name from england_people

結果:

名前
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 と組み合わせて、複数のテーブルにわたるデータを集計することもできます。コツは、UNION ALL をサブクエリの中にラップし、その上でグルーピングとソートを適用することです。

例えば、両方のテーブルでそれぞれの名前が何回現れるかを数えたいとしましょう:

SELECT name, COUNT(*) AS total_count
FROM (
    SELECT name FROM germany_people
    UNION ALL
    SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESC

結果:

nametotal_count
Lena2
Leonie1
George1

ここでは、UNION ALLUNION ではなく)が使用されているため、Lena のような重複が保持されます。そうしないと、カウントする前に削除されてしまいます。サブクエリがすべての行をマージし、その後に GROUP BY + COUNT がそれらを集計します。ORDER BY が最終結果をソートします。

challenge icon

チャレンジ

簡単

利用可能なテーブルとカラム:

  • <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 としてください。

結果を売上合計の降順で並べ替えてください。

自分で試してみよう

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン