データベースの基礎
社員表(氏名, 部署, 給与)に8行あり、部署ごとの給与は、営業が320、280、350、開発が400、310、総務が260、300、企画が330である。SELECT 部署, COUNT(*) FROM 社員 WHERE 給与 >= 300 GROUP BY 部署 HAVING COUNT(*) >= 2 の結果は何行になるか。
- A2行
- B3行
- C4行
答えと解説を見る
正解:A. 2行
まずWHEREで、給与が300以上の行だけを残します。営業は320と350の2行、開発は400と310の2行、総務は300の1行、企画は330の1行が残り、営業の280と総務の260は除かれます。次にGROUP BYで部署ごとにまとめると4グループになり、それぞれの行数は営業2、開発2、総務1、企画1です。最後に HAVING COUNT(*) >= 2 で行数が2以上のグループだけを残すので、営業と開発の2行が結果になります。WHEREを付けずに数えると、営業3、開発2、総務2、企画1となり、HAVINGを満たすのは3行です。WHEREはグループ化の前、HAVINGはグループ化の後に働くという順番が、結果を左右します。
- A. 正しい。WHEREで絞ったあとに2行以上残る営業と開発の2行です。
- B. WHEREで給与300未満の行を除く前に数えた場合の結果で、総務が誤って残っています。
- C. HAVINGで絞る前のグループの数です。