SQLの条件式と集計

SQLでは、データの検索や集計を行う際に、様々な条件式や句を組み合わせて柔軟なクエリを作成できます。

条件式

CASE

CASE 式は、SQLにおける条件分岐の機能を提供します。プログラミング言語の if-else if-else 文や switch 文に似ています。SELECT 句や WHERE 句、ORDER BY 句など、様々な場所で使用できます。

CASE
    WHEN 条件1 THEN 結果1
    WHEN 条件2 THEN 結果2
    -- ... 任意の数のWHEN-THEN句
    ELSE 結果N -- どの条件にも合致しない場合のデフォルト値 (省略可能)
END

例:

SELECT
    product_name,
    price,
    CASE
        WHEN price >= 1000 THEN '高価格帯'
        WHEN price >= 500 THEN '中価格帯'
        ELSE '低価格帯'
    END AS price_category
FROM
    products;

集計とグループ化

GROUP BY

GROUP BY 句は、指定した列の値に基づいて行をグループ化し、各グループに対して集計関数(COUNT, SUM, AVG, MAX, MIN など)を適用するために使用します。

SELECT 列リスト, 集計関数(列名)
FROM 表名
GROUP BY グループ化対象列;

例:

SELECT
    category,
    COUNT(*) AS total_products,
    AVG(price) AS average_price
FROM
    products
GROUP BY
    category;

このクエリは、products テーブルを category 列でグループ化し、各カテゴリの製品数と平均価格を計算します。

HAVING

HAVING 句は、GROUP BY 句でグループ化された結果に対して、さらに条件を適用してフィルタリングを行うために使用します。WHERE 句が個々の行をフィルタリングするのに対し、HAVING 句はグループ全体をフィルタリングします。

SELECT 列リスト, 集計関数(列名)
FROM 表名
GROUP BY グループ化対象列
HAVING グループに対する条件式;

例:

SELECT
    category,
    COUNT(*) AS total_products,
    AVG(price) AS average_price
FROM
    products
GROUP BY
    category
HAVING
    COUNT(*) >= 5; -- 製品数が5つ以上のカテゴリのみを抽出

このクエリは、カテゴリごとの製品数と平均価格を計算し、その中で製品数が5つ以上のカテゴリのみを表示します。

WHEREHAVING の違い

  • WHERE 句: GROUP BYに適用され、個々の行をフィルタリングします。集計関数は使用できません。
  • HAVING 句: GROUP BYに適用され、グループ化された結果をフィルタリングします。集計関数を使用できます。

これらの句を適切に組み合わせることで、複雑なデータ分析やレポート作成を行うことができます。