平成25年度 春期 午前Ⅱ 問5
データ操作
集約関数に関する問題
“社員”表から,役割名がプログラマである社員が3人以上所属している部門の部門名を取得する SQL 文はどれか。ここで,実線の下線は主キーを表す。
社員(社員番号,部門名,社員名,役割名)
- アSELECT 部門名 FROM 社員 GROUP BY 部門名 HAVING COUNT(*) >= 3 WHERE 役割名 = 'プログラマ'
- イSELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 AND 役割名 = 'プログラマ' GROUP BY 部門名
- ウSELECT 部門名 FROM 社員 WHERE COUNT (*) >= 3 GROUP BY 部門名 HAVING 役割名 = 'プログラマ'
- エSELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3
答えと解説を見る
✓ これが正解エSELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3
解説
WHERE で絞ってから部門でまとめ、HAVING で人数を条件にします。
SELECT 文は、FROM、WHERE、GROUP BY、HAVING の順に書き、この順に評価されると考えて読みます。WHERE は行を一つずつ見て絞り込む句なので、まず役割名がプログラマである行だけを残します。次に GROUP BY 部門名で部門ごとにまとめ、HAVING COUNT(*) >= 3 でプログラマが3人以上いるグループだけを残します。COUNT(*) のような集約関数はグループに対して計算する値なので、WHERE には書けず HAVING に書きます。行の条件は WHERE、グループの条件は HAVING と分けて考えると、句の置き場所を間違えません。
ほかの選択肢はなぜ違うのか
- アSELECT 部門名 FROM 社員 G…:条件の中身は正しいものの、WHERE 句を HAVING 句の後ろに置いています。SELECT 文の句には書く順序が決まっていて、WHERE は GROUP BY より前に書く必要があるため、この文は構文として成り立ちません。
- イSELECT 部門名 FROM 社員 W…:集約関数の COUNT(*) を WHERE 句に書いています。WHERE は1行ずつ判定する段階で、まだグループができていないため、グループの件数を条件にすることはできません。
- ウSELECT 部門名 FROM 社員 W…:件数の条件を WHERE に、役割名の条件を HAVING に置いていて、二つの置き場所が逆です。役割名はグループ化の列でも集約関数でもないので、HAVING に書いてもグループごとに値が一つに定まりません。
この問題の用語
- ログいつ誰が何をしたかを、機器やソフトウェアが自動で残していく記録です。あとから出来事をたどれるので、事故の調査や不正の発見に使われます。
- 部門組織の中で、仕事の種類や担当ごとに分けられたまとまりです。専門ごとに分ける分け方と、製品や地域ごとに分ける分け方があります。
出典:平成25年度 春期 データベーススペシャリスト試験 午前Ⅱ 問5
同じ用語が出る問題
- 令和5年度 秋期 午前Ⅱ 問19:DRDoSに関する問題(ログ)
- 令和2年度 10月 午前Ⅱ 問23:フェールオーバ処理の順序(ログ)
- 平成26年度 春期 午前Ⅱ 問18:データマイニングに関する説明(部門)
- 平成24年度 春期 午前Ⅱ 問11:副問合せに関する問題(部門)
- 平成21年度 春期 午前Ⅱ 問9:集約関数に関する問題(部門)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)