平成30年度 秋期 午前Ⅱ 問21
データベース
SQL文
“社員”表から,役割名がプログラマである社員が3人以上所属している部門の部門名を取得するSQL文はどれか。ここで,実線の下線は主キーを表す。
社員(社員番号,部門名,社員名,役割名)
- ア`SELECT 部門名 FROM 社員 GROUP BY 部門名 HAVING COUNT(*) >= 3 WHERE 役割名 = 'プログラマ'`
- イ`SELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 GROUP BY 部門名 HAVING 役割名 = 'プログラマ'`
- ウ`SELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 AND 役割名 = 'プログラマ' GROUP BY 部門名`
- エ`SELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3`
答えと解説を見る
✓ これが正解エ`SELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3`
解説
WHERE で行を絞り、部門で分けてから HAVING で3人以上を選びます。
SQL では、WHERE 句で表の行を絞り込み、GROUP BY 句でグループに分け、HAVING 句でグループ単位の条件を付けるという順序で処理が進みます。見分ける軸は、それぞれの条件が行単位の条件か、グループ単位の条件かです。役割名がプログラマであるという条件は一行ずつ判定できるので、WHERE 句に書きます。そのうえで部門名ごとにまとめ、COUNT(*) で数えた人数が3以上という条件はグループに対するものなので、HAVING 句に書きます。この順序どおりに書かれているのは、WHERE で役割名を絞り、GROUP BY で部門名ごとに分け、HAVING で COUNT(*) が3以上を指定した文です。集合関数を使った条件は WHERE 句に書けない、と覚えておくと誤った文を外せます。
ほかの選択肢はなぜ違うのか
- ア`SELECT 部門名 FROM 社員 …:HAVING 句の後ろに WHERE 句を置いており、句の並び順が SQL の文法に合いません。WHERE 句は GROUP BY 句より前に書く必要があるので、この文はそもそも実行できず、部門名を取得できません。
- イ`SELECT 部門名 FROM 社員 …:COUNT(*) のような集合関数を使った条件を WHERE 句に書いています。WHERE 句は一行ずつ判定する条件なので集合関数は使えず、さらに行単位の役割名の条件を HAVING 句に置いている点も逆になっています。
- ウ`SELECT 部門名 FROM 社員 …:役割名の条件と COUNT(*) の条件をまとめて WHERE 句に書いています。グループに分ける前の行単位の判定ではまだ人数を数えられないので、集合関数を使った条件は WHERE 句に置けません。
この問題の用語
- ログいつ誰が何をしたかを、機器やソフトウェアが自動で残していく記録です。あとから出来事をたどれるので、事故の調査や不正の発見に使われます。
- 部門組織の中で、仕事の種類や担当ごとに分けられたまとまりです。専門ごとに分ける分け方と、製品や地域ごとに分ける分け方があります。
出典:平成30年度 秋期 ITサービスマネージャ試験 午前Ⅱ 問21
同じ用語が出る問題
- 令和5年度 春期 午前Ⅱ 問22:クラウドサービス派生データの問題(ログ)
- 令和5年度 春期 午前Ⅱ 問11:フルバックアップに関する問題(ログ)
- 令和元年度 秋期 午前Ⅱ 問13(部門)
- 平成29年度 秋期 午前Ⅱ 問15:職務の分離の例(部門)
- 平成27年度 秋期 午前Ⅱ 問15:システム監査に関する問題(部門)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)