Menu
Coddy logo textTech

Union

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

ユニオンはジョインとは異なります。ジョインは条件を使用してテーブルを結合しますが、ユニオンは2つのテーブルを縦に追加するだけです。UNIONを使用するには、次のように書きます:

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

両方のセレクトは以下のルールを守る必要があります:

  • フィールドの数が一致する必要があります
  • 順序が重要です
  • 同じ位置にある列はデータ型を一致させる必要があります

例えば、以下のテーブルがあるとします:

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

問題:私たちが持っているすべての名前を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

結果:

名前合計
Lena2
Leonie1
George1

ここで、UNION ALL はすべての行(重複を含む)を保持するため、COUNT が実際の出現回数を反映します。外側のクエリは次に、結合された結果をグループ化して並べ替えます。

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 と名付けなさい。

総販売量で降順にソートしなさい。

チートシート

UNION はテーブルを縦方向に積み重ねて結合します。ジョインとは異なり、UNION は条件を使用せず、単にテーブルを一つ上に追加します。

基本的な UNION 構文:

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

UNION のルール:

  • フィールドの数が等しくなければならない
  • 順序が重要です
  • 同じ位置の列はデータ型が一致しなければならない

UNION と UNION ALL:

  • UNION は重複を除いたユニークな値のみを返します
  • UNION ALL は重複を含むすべてのレコードを返します
SELECT name FROM germany_people
UNION
SELECT name FROM england_people
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people

UNION ALL をサブクエリ内で使用し、結合結果に対して GROUP BYORDER 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

これにより、両方のテーブルにわたって各名前が何回出現するかを、重複を含めてカウントします。

自分で試してみよう

quiz icon腕試し

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

基礎のすべてのレッスン