🍩

[SQL] Where句とHaving句の違い

2024/10/13に公開
SELECT release_year, COUNT(*) AS books_num
FROM books
GROUP BY release_year
HAVING COUNT(*) >= 2
ORDER BY books_num DESC;

(SQL練習サイト https://sqlab.net/works/intermediate/29/ より)

このクエリを WHERE 句を使って書き換えると、サブクエリや共通テーブル式(CTE)を使用して集計結果を一時的に保持し、その上で WHERE 句を適用することになる。いかにその例を示す。

サブクエリを使用した場合:

SELECT release_year, books_num
FROM (
    SELECT release_year, COUNT(*) AS books_num
    FROM books
    GROUP BY release_year
) AS sub
WHERE books_num >= 2
ORDER BY books_num DESC;

共通テーブル式(CTE)を使用した場合:

WITH aggregated_books AS (
    SELECT release_year, COUNT(*) AS books_num
    FROM books
    GROUP BY release_year
)
SELECT release_year, books_num
FROM aggregated_books
WHERE books_num >= 2
ORDER BY books_num DESC;

WHEREHAVING の違い:

  • WHERE 句:

    • 目的: 個々の行をフィルタリングします。

    • 適用タイミング: GROUP BY や集計関数が適用されるに作用します。

    • 使用可能な内容: 直接的な列名や算術演算子、リテラル値を使用できますが、集計関数(COUNTSUM など)は使用できません。

    • 例:

      SELECT release_year, COUNT(*) AS books_num
      FROM books
      WHERE author = '山田太郎'
      GROUP BY release_year;
      
      
  • HAVING 句:

    • 目的: グループ化された結果をフィルタリングします。

    • 適用タイミング: GROUP BY によるグループ化や集計関数の適用に作用します。

    • 使用可能な内容: 集計関数を使用できます。

    • 例:

      SELECT release_year, COUNT(*) AS books_num
      FROM books
      GROUP BY release_year
      HAVING COUNT(*) >= 2;
      

Discussion