用語比較
WHERE句とHAVING句の違い|集計の前に絞るか、後に絞るか(DS検定)
WHERE句とHAVING句は、どちらもSQLで行を絞り込む条件を書く場所で、違いは絞り込むタイミングです。WHERE句はグループ化と集計の前に元の行を、HAVING句はグループ化と集計の後にグループの行を絞り込みます。
集計の前に絞るのがWHERE、集計の後に絞るのがHAVINGと区別します。PostgreSQLの公式文書は、WHEREは集計関数の計算に入る行を選び、HAVINGは集計が済んだグループの行を選ぶと説明しています。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
WHERE句とHAVING句の要点
WHERE句
グループ化と集計の前に、元の行を条件で絞り込む。集計関数は書けない。
HAVING句
グループ化と集計の後に、グループの行を条件で絞り込む。集計関数を使った条件を書く。
違いを表で確認
| 比較軸 | WHERE句 | HAVING句 |
|---|---|---|
| 絞り込むタイミング | グループ化と集計の前 | グループ化と集計の後 |
| 絞り込む対象 | 元の表の行 | GROUP BYでできたグループの行 |
| 集計関数 | 条件に書けない | 条件に書く。公式文書は、HAVING句には通常集計関数が入ると説明している |
| 集計の結果への影響 | 集計の計算に入る行そのものが減る | 集計の計算は変わらず、結果の行だけが減る |
| 試験で探す語 | 行の条件、集計の前、元のデータ | グループの条件、集計の後、GROUP BY |
DS検定の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
GROUP BYの結果を条件で絞りたい人
「件数が3件以上のグループだけ」のように、集計した値で絞るときはHAVING句を使います。集計の前の行には、その値がまだ存在しないためです。
集計に入れる行を先に減らしたい人
「東京の行だけ集計したい」のように、元の行の値で絞れるときはWHERE句を使います。PostgreSQLの公式文書は、集計が不要な条件をWHEREに置く方が、全行のグループ化と集計を避けられるため効率がよいと説明しています。
WHEREに集計関数を書いてエラーになった人
WHERE句は集計の前に評価されるため、集計関数の結果を使えません。公式文書は、集計の入力行を選ぶ条件に集計結果を使うのは意味がないと説明しています。集計後の条件はHAVINGに移します。
具体例で使い分ける
例 1
都市ごとの観測回数のうち、観測が複数あった都市だけを見る場合
観測の表から、都市ごとの件数を数え、件数が2以上の都市だけを出したい場面です。
- 件数は、都市ごとにグループ化して数えて初めて決まります。
- 集計した値の条件なので、GROUP BYの後に、HAVING count(*) >= 2のように書きます。
結論: 集計した値で絞るので、HAVING句を使います。
例 2
都市名がSで始まる都市だけを、都市ごとに集計する場合
観測の表から、名前が決まった文字で始まる都市だけを対象にして、都市ごとの件数を数えたい場面です。
- 都市名は元の行にある値で、集計を待たずに判定できます。
- そのため、集計の前にWHERE city LIKE 'S%'で行を減らし、その後にGROUP BYで数えます。
結論: 元の行の値で絞るので、WHERE句を使います。
問題文から答えを選ぶ手順
- 1
条件が何の値を使うかを見る
元の行の列の値で判定できるか、集計した値で判定するかを確かめます。
- 2
元の行の値ならWHEREに書く
集計の前に行を絞ります。集計に入る行が減るため、計算の手間も減ります。
- 3
集計した値ならHAVINGに書く
GROUP BYの後に、count、max、sumなどの集計関数を使った条件を書きます。
- 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に置く理由を言える
関連ページで確認する
同じ資格で次に知りたいこと
- Webスクレイピングと Web API の違い|画面から取るか、提供口から取るか(DS検定)
Webスクレイピングと Web API の違いを、データの取り方、安定性、使える範囲、注意点で解説。DS検定のデータ収集で問われる静的コンテンツの収集とREST APIの使い分けと確認問題つきです。
- UNIONとUNION ALLの違い|重複行を除くか、残すか(DS検定)
SQLのUNIONとUNION ALLの違いを、重複行の扱い、結合できる条件、使い分けの例で解説。DS検定のデータ加工で問われるUNION処理の確認問題つきです。
- HadoopとSparkの違い|保存と処理の基盤か、処理エンジンか(DS検定)
HadoopとSparkの違いを、役割、データの置き場所、MapReduceとの関係、向く用途で解説。DS検定のデータ蓄積で問われるHDFS・MapReduce・YARNの位置づけと確認問題つきです。
よくある質問
QWHERE句とHAVING句の一番大きな違いは何ですか?
絞り込むタイミングです。WHEREは集計の前に元の行を絞り、HAVINGは集計の後にグループの行を絞ります。
Q集計が要らない条件を、HAVINGに書いてもよいですか?
PostgreSQLの公式文書は、集計関数を使わないHAVING句も書けるものの、あまり役に立たないと説明しています。同じ条件をWHEREの段階で使う方が効率がよいとされています。
QWHEREとHAVINGは同じSQLに両方書けますか?
書けます。元の行の条件はWHERE、集計した値の条件はHAVINGに分けて書きます。PostgreSQLの公式文書の例も、WHEREで行を絞ってからGROUP BYで集計しています。
QDS検定にSQLのGROUP BYは出ますか?
データサイエンティスト協会のスキルチェックリストに、SQLの構文を一通り知っていて記述・実行できること(集計関数とGROUP BYを含む)が★1つ星として含まれます。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
