AI資格ドリル
資格を選ぶ

用語比較

WHERE句とHAVING句の違い|集計の前に絞るか、後に絞るか(DS検定)

WHERE句とHAVING句は、どちらもSQLで行を絞り込む条件を書く場所で、違いは絞り込むタイミングです。WHERE句はグループ化と集計の前に元の行を、HAVING句はグループ化と集計の後にグループの行を絞り込みます。

集計の前に絞るのがWHERE、集計の後に絞るのがHAVINGと区別します。PostgreSQLの公式文書は、WHEREは集計関数の計算に入る行を選び、HAVINGは集計が済んだグループの行を選ぶと説明しています。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。

WHERE句とHAVING句の要点

WHERE句

グループ化と集計の前に、元の行を条件で絞り込む。集計関数は書けない。

HAVING句

グループ化と集計の後に、グループの行を条件で絞り込む。集計関数を使った条件を書く。

違いを表で確認

比較軸WHERE句HAVING句
絞り込むタイミンググループ化と集計の前グループ化と集計の後
絞り込む対象元の表の行GROUP BYでできたグループの行
集計関数条件に書けない条件に書く。公式文書は、HAVING句には通常集計関数が入ると説明している
集計の結果への影響集計の計算に入る行そのものが減る集計の計算は変わらず、結果の行だけが減る
試験で探す語行の条件、集計の前、元のデータグループの条件、集計の後、GROUP BY

どこで迷っているかを切り分ける

01

GROUP BYの結果を条件で絞りたい人

「件数が3件以上のグループだけ」のように、集計した値で絞るときはHAVING句を使います。集計の前の行には、その値がまだ存在しないためです。

02

集計に入れる行を先に減らしたい人

「東京の行だけ集計したい」のように、元の行の値で絞れるときはWHERE句を使います。PostgreSQLの公式文書は、集計が不要な条件をWHEREに置く方が、全行のグループ化と集計を避けられるため効率がよいと説明しています。

03

WHEREに集計関数を書いてエラーになった人

WHERE句は集計の前に評価されるため、集計関数の結果を使えません。公式文書は、集計の入力行を選ぶ条件に集計結果を使うのは意味がないと説明しています。集計後の条件はHAVINGに移します。

具体例で使い分ける

例 1

都市ごとの観測回数のうち、観測が複数あった都市だけを見る場合

観測の表から、都市ごとの件数を数え、件数が2以上の都市だけを出したい場面です。

  • 件数は、都市ごとにグループ化して数えて初めて決まります。
  • 集計した値の条件なので、GROUP BYの後に、HAVING count(*) >= 2のように書きます。

結論: 集計した値で絞るので、HAVING句を使います。

例 2

都市名がSで始まる都市だけを、都市ごとに集計する場合

観測の表から、名前が決まった文字で始まる都市だけを対象にして、都市ごとの件数を数えたい場面です。

  • 都市名は元の行にある値で、集計を待たずに判定できます。
  • そのため、集計の前にWHERE city LIKE 'S%'で行を減らし、その後にGROUP BYで数えます。

結論: 元の行の値で絞るので、WHERE句を使います。

問題文から答えを選ぶ手順

  1. 1

    条件が何の値を使うかを見る

    元の行の列の値で判定できるか、集計した値で判定するかを確かめます。

  2. 2

    元の行の値ならWHEREに書く

    集計の前に行を絞ります。集計に入る行が減るため、計算の手間も減ります。

  3. 3

    集計した値ならHAVINGに書く

    GROUP BYの後に、count、max、sumなどの集計関数を使った条件を書きます。

  4. 4

    両方の条件があるなら、両方を使う

    元の行の条件はWHERE、集計後の条件はHAVINGに分けて書きます。

試験での見分け方

  • 1WHERE句は、グループ化と集計の前に、元の行を絞り込む。
  • 2HAVING句は、グループ化と集計の後に、グループの行を絞り込む。
  • 3WHERE句に集計関数は書かない。集計した値の条件はHAVING句に書く。

誤答しやすい選択肢

WHEREとHAVINGを、同じ働きだと考える

修正: 絞り込むタイミングが違います。WHEREは集計の前、HAVINGは集計の後です。

WHERE句に、集計関数を使った条件を書く

修正: WHERE句は集計の前に評価されるため、集計関数を使えません。集計した値の条件はHAVING句に書きます。

元の行の条件まで、HAVING句に書く

修正: 公式文書は、集計が不要な条件はWHEREの段階で使う方が効率がよいと説明しています。元の行で決まる条件はWHEREに書きます。

確認問題

Q1グループ化と集計の前に、元の行を絞り込むのはどちらの句ですか?

答え: WHERE句

WHEREは集計関数の計算に入る行を選びます。

Q2集計した値の条件で、グループの行を絞り込むのはどちらの句ですか?

答え: HAVING句

HAVINGは、グループ化と集計が済んだ後のグループの行を選びます。

Q3WHERE句に書けないものは何ですか?

答え: 集計関数

公式文書は、集計の入力行を選ぶ条件に集計関数を使うのは意味がないと説明しています。

到達チェック

  • WHEREとHAVINGの絞り込むタイミングの違いを言える
  • WHERE句に集計関数を書けない理由を説明できる
  • 集計した値の条件をHAVINGに書ける
  • 元の行で決まる条件はWHEREに置く理由を言える

同じ資格で次に知りたいこと

よくある質問

QWHERE句とHAVING句の一番大きな違いは何ですか?

A

絞り込むタイミングです。WHEREは集計の前に元の行を絞り、HAVINGは集計の後にグループの行を絞ります。

Q集計が要らない条件を、HAVINGに書いてもよいですか?

A

PostgreSQLの公式文書は、集計関数を使わないHAVING句も書けるものの、あまり役に立たないと説明しています。同じ条件をWHEREの段階で使う方が効率がよいとされています。

QWHEREとHAVINGは同じSQLに両方書けますか?

A

書けます。元の行の条件はWHERE、集計した値の条件はHAVINGに分けて書きます。PostgreSQLの公式文書の例も、WHEREで行を絞ってからGROUP BYで集計しています。

QDS検定にSQLのGROUP BYは出ますか?

A

データサイエンティスト協会のスキルチェックリストに、SQLの構文を一通り知っていて記述・実行できること(集計関数とGROUP BYを含む)が★1つ星として含まれます。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)