基本情報技術者試験 (FE) 科目 A — データベース
GROUP BY と HAVING — WHERE との違い
GROUP BY は指定した列の値が等しい行を 1 つのグループにまとめ、集約関数はグループごとに計算される。HAVING はグループに対する絞り込みで、行に対する絞り込みである WHERE より後に評価される。
GROUP BY は行をグループにまとめる
集約関数は 表全体を 1 つの値にまとめました。GROUP BY を付けると、指定した列の値が同じ行ごとに集計されます。
SELECT 部門コード, COUNT(*), AVG(給与)
FROM 従業員
GROUP BY 部門コード部門コードが同じ行が 1 グループになり、グループの数だけ結果の行ができます。
試す: GROUP BY を消すと 1 行にまとまる
HAVING はグループを絞り込む
「2 人以上いる部門だけ」のように、集計した結果で絞り込みたいときに HAVING を使います。
GROUP BY 部門コード
HAVING COUNT(*) >= 2試す: HAVING の条件を >= 3 にすると残るグループが減る
WHERE と HAVING の違いは「評価順」で決まる
この 2 つの違いは、暗記ではなく評価順で理解できます。
FROM— 表を読み込むWHERE— 1 行ずつ絞り込むGROUP BY— 残った行をグループにまとめるHAVING— グループ単位で絞り込むSELECT— 列を取り出す
WHERE は 2 番目、グループができるのは 3 番目です。 つまり WHERE の時点ではまだグループが存在しないので、WHERE COUNT(*) > 1 は書けません。これが理由のすべてです。
逆に「D01 部門の中で平均を出したい」のようにグループ化する前に行を減らすのは WHERE の仕事です。 両方書くこともできます。
試す: HAVING の条件を WHERE に移すとエラーになる
GROUP BY に無い列は取り出せない
SELECT 氏名, COUNT(*) FROM 従業員 GROUP BY 部門コード
-- エラー: 氏名 は GROUP BY に無いD01 部門には青木・井上・上田の 3 人がいます。 このグループの「氏名」はどれを出せばよいか決まりません。 だから標準 SQL ではエラーになります。
一部のデータベース製品は黙って通してしまいますが、試験では誤りです。この実行シミュレーターも 標準 SQL に合わせてエラーにしています。
試す: このままだとエラー。氏名 を MAX(氏名) にするか GROUP BY に足すと通る
グループの集合として見る
一つ進めるを押してください。GROUP BY の段階で、行の集合ではなくグループの集合が表示されます。 HAVING がそのグループをどう減らすかも次の段階で見えます。 WHERE と HAVING の違いが一番はっきり分かる場所です。
試す: 一つ進める で GROUP BY と HAVING の段階を見比べる
試験で問われるポイント
- WHERE と HAVING のどちらに書くか。最頻出です
- 結果が何行になるか=グループがいくつできるか
- GROUP BY に無い列を SELECT に書いた選択肢は誤りだと見抜けること
- WHERE と HAVING を両方書いたときの評価順
よくある疑問
「GROUP BY と HAVING」の練習問題 2 問
読んだ内容がそのまま出題されます。解答すると解説と、 その SQL を実行シミュレーターで開くリンクが出ます。
自由に試す / 他のレッスンを読む
データベース分野をもっと学ぶ(おすすめ書籍)
イラスト主体で科目Aの全範囲を通読できる入門書。用語の土台を作ってから科目Bのアルゴリズムに入ると理解が速い。
科目Aの頻出テーマを図と語呂で押さえる入門書。参考書と問題集を兼ねるので初受験の一冊目に選びやすい。
公開問題を大量に解いて仕上げるための問題集。擬似言語の読解に慣れた後、本番形式で時間配分を試す段階で使う。
本セクションはAmazonアソシエイトのリンクを含みます。
プログラムの読み方でつまずいたら。
たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)