メインコンテンツへ
データベース

次のSQL文の実行結果として、正しいものはどれか。 SELECT 部署名, AVG(給与) AS 平均給与 FROM 社員 WHERE 給与 >= 300000 GROUP BY 部署名 HAVING AVG(給与) >= 400000 ORDER BY 平均給与 DESC;

ア.全社員の平均給与が400,000円以上の部署のみを昇順に表示する。
イ.給与が300,000円以上の社員を対象に、部署ごとの平均給与を集計し、その平均が400,000円以上の部署を平均給与の降順で表示する。正解
ウ.給与が400,000円以上の部署名と平均給与を降順で表示する。
エ.全社員を対象に部署ごとの平均給与を集計し、400,000円以上の部署を降順で表示する。

解説

SQLのWHEREは「集計前のフィルター」、HAVINGは「集計後のフィルター」。料理で言えば、WHEREは食材の下ごしらえで傷んだ食材を取り除き、HAVINGは完成した料理の中から合格品だけを選ぶ検品です。

なぜ イ が正解か

SQL実行順序:①FROM(社員テーブルから)→②WHERE(給与≥30万の社員に絞る)→③GROUP BY(部署名でグループ化)→④集計関数(平均給与を計算)→⑤HAVING(平均≥40万の部署に絞る)→⑥SELECT(部署名と平均給与を選択)→⑦ORDER BY(平均給与の降順でソート)。WHEREで先に30万未満を除外してから集計し、さらにHAVINGで集計後の結果を絞り込んでいます。

なぜ ア は間違いか

昇順と降順が逆です。ORDER BY 平均給与 DESCはDESC(降順)なので、高い順に表示されます。また「全社員」ではなくWHEREで給与30万以上に絞った社員が対象です。

なぜ ウ は間違いか

WHEREの条件(給与≥30万)を無視して、HAVINGの条件だけを「給与が400,000円以上」と誤読しています。WHEREは行単位のフィルタ、HAVINGはグループ(集計後)のフィルタで、適用タイミングが異なります。

なぜ エ は間違いか

WHEREを無視して「全社員」を対象にしていると誤って解釈しています。WHERE句が存在する以上、給与30万未満の社員は集計前に除外されます。「全社員対象」はWHERE句がない場合の話です。

出典: AI生成問題(学習用)