平成25年度 秋期 午前Ⅱ 問21
データベース
SQL文
“社員”表から同姓同名が存在する社員の氏名を抽出するSQL文はどれか。
社員
| 社員番号 | 氏名 | 生年月日 | 所属 |
|---|---|---|---|
| 0001 | 新井 健二 | 1970-02-04 | 営業部 |
| 0002 | 鈴木 太郎 | 1975-03-13 | 総務部 |
| 0003 | 佐藤 宏 | 1981-07-11 | 技術部 |
| 0004 | 田中 博 | 1978-01-24 | 企画部 |
| 0005 | 鈴木 太郎 | 1968-11-09 | 営業部 |
| ⋮ | ⋮ | ⋮ | ⋮ |
- アSELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1
- イSELECT 氏名 FROM 社員 WHERE 氏名 = 氏名
- ウSELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 ORDER BY 氏名
- エSELECT 氏名, COUNT(*) FROM 社員 GROUP BY 氏名
答えと解説を見る
✓ これが正解アSELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1
解説
氏名でグループ化し、件数が2以上のグループだけを残します。
同姓同名の社員がいるかどうかは、同じ氏名の行が2行以上あるかどうかで判定できます。GROUP BY 氏名で同じ氏名の行を一つのグループにまとめ、HAVING COUNT(*) > 1でグループごとの行数が1を超えるものだけを残すと、重複している氏名だけが取り出せます。例の表なら、鈴木 太郎のグループが2行になるので抽出されます。WHEREは行を一つずつ見て絞り込む句で、グループの件数を条件にするときはHAVINGを使います。集計結果で絞るならHAVING、と覚えておくと選べます。
ほかの選択肢はなぜ違うのか
- イSELECT 氏名 FROM 社員 WH…:WHERE 氏名 = 氏名は、同じ行の同じ列どうしを比べているだけなので、氏名が入っている行では常に成り立ちます。結果は全社員の氏名がそのまま並ぶだけで、同姓同名かどうかは判定されません。
- ウSELECT 氏名 FROM 社員 WH…:絞込みの条件は同じ行の氏名を自分自身と比べるだけで、全ての行が残ります。ORDER BYで氏名順に並べ替えても、同姓同名が隣り合って見やすくなるだけで、重複した氏名だけを抽出することにはなりません。
- エSELECT 氏名, COUNT(*) …:GROUP BYで氏名ごとの件数は求められますが、件数で絞り込む条件がありません。1人しかいない氏名も件数1として全て出力されるので、同姓同名の社員だけを取り出したことになりません。
この問題の用語
- 企画何のために作るのかを決め、進める形をまとめる最初の段階です。ここで業務の進め方そのものを見直すと、大きな改善につながります。
出典:平成25年度 秋期 システムアーキテクト試験 午前Ⅱ 問21
同じ用語が出る問題
- 平成30年度 秋期 午前Ⅱ 問2:共通フレームに関する問題(企画)
- 平成22年度 秋期 午前Ⅱ 問16:開発計画で明確にすべきもの(企画)
- 平成21年度 秋期 午前Ⅱ 問15:企画業務の段階で策定すべきもの(企画)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)