Menu
CoddyTech

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

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

問題: 持っているすべての名前をまとめた大きなテーブルを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

集計関数、GROUP BY、ORDER BYとUNION ALLを組み合わせて、複数のテーブルにまたがるデータを集計することもできます。コツは、サブクエリの中に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

ここでは、Lenaのような重複を残すために、UNIONではなくUNION ALLを使用しています。そうしないと、カウントする前に重複が削除されます。サブクエリですべての行を結合し、その後、GROUP BYとCOUNTで集計します。ORDER BYで最終結果を並べ替えます。

challenge icon

チャレンジ

簡単

利用可能なテーブルと列:

  • sales_2009: product_id, quantity_sold
  • sales_2010: product_id, quantity_sold
  • sales_2011: product_id, quantity_sold

売上テーブルは3つあります。

すべてのテーブルを合わせて、各商品の売上合計を求めてください。

結果にはproduct_idと売上合計を含めてください。

この列にtotal_salesという名前を付けてください。

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

自分で試してみよう

-- すべての行を保持しながら、3つのテーブルを1つの結果にまとめる
SELECT product_id, ____ AS total_sales
FROM (
    SELECT * FROM sales_2009
    ____
    SELECT * FROM sales_2010
    ____
    SELECT * FROM sales_2011
)
-- 商品ごとに1行とし、合計が大きい順に並べる
GROUP BY ____
ORDER BY ____ DESC;
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: SQLプレイグラウンド