🍩
[SQL] Where句とHaving句の違い
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;
WHERE
と HAVING
の違い:
-
WHERE
句:-
目的: 個々の行をフィルタリングします。
-
適用タイミング:
GROUP BY
や集計関数が適用される前に作用します。 -
使用可能な内容: 直接的な列名や算術演算子、リテラル値を使用できますが、集計関数(
COUNT
、SUM
など)は使用できません。 -
例:
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