平成25年度 春期 データベーススペシャリスト試験 午前Ⅱ 問5
テクノロジ/データベース“社員”表から,役割名がプログラマである社員が3人以上所属している部門の部門名を取得するSQL文はどれか。ここで,実線の下線は主キーを表す。 社員(社員番号,部門名,社員名,役割名) ※社員番号が主キー
出典:平成25年度 春期 データベーススペシャリスト試験 午前Ⅱ 問5
- ア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
正解:エ
解説
SQLのSELECT文では,句の記述順序及び処理順序は,FROM句→WHERE句(行の絞り込み)→GROUP BY句(グループ化)→HAVING句(グループの絞り込み)→SELECT句の順になる。「役割名がプログラマである社員」という行の絞り込みはグループ化(部門ごとの集計)を行う前にWHERE句で行い,その上で部門ごとにグループ化し,各部門のプログラマの人数が3人以上であるという条件をHAVING句とCOUNT(*)によって絞り込む必要がある。したがって,「WHERE 役割名 = 'プログラマ' → GROUP BY 部門名 → HAVING COUNT(*) >= 3」という記述順序・内容になっているものが正しい。
選択肢ごとの解説
- ア誤り。句の記述順序が「GROUP BY→HAVING→WHERE」となっており,SQLの構文上,WHERE句はGROUP BY句より前に記述しなければならないため,この順序は構文として誤りである。
- イ誤り。WHERE句の条件に集約関数COUNT(*)が含まれているが,WHERE句は個々の行を対象とする条件式であり,集約関数を含めることはできない(集約関数を用いた絞り込みはHAVING句で行う)。
- ウ誤り。WHERE句の条件に集約関数COUNT(*)が含まれており,構文として誤りであるのに加え,役割名による絞り込み(HAVING 役割名 = 'プログラマ')をグループ化の後に行っているため,プログラマ以外の社員も含めて部門ごとの件数が数えられてしまい,意図した結果にならない。
- エ正しい。WHERE句で役割名がプログラマである社員だけに絞り込んだ上で部門名ごとにグループ化し,HAVING句でグループの件数(プログラマの人数)が3以上である部門だけを取り出しており,句の順序・内容ともに正しい。