ホーム > システムアーキテクト試験 > 2013年
システムアーキテクト試験 2013年 午前2 問21
“社員”表から同姓同名が存在する社員の氏名を抽出するSQL文はどれか。

イ:SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名
ウ:SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 ORDER BY 氏名
エ:SELECT 氏名、COUNT(*)FROM 社員 GROUP BY 氏名
ア:SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*)> 1(正解)
解説
社員表から同姓同名の社員氏名を抽出するSQL文【午前2 解説】
要点まとめ
- 結論:同姓同名の社員氏名を抽出するには、氏名でグループ化し、出現回数が2回以上のものを抽出するSQL文が正解です。
- 根拠:GROUP BY句で氏名ごとに集約し、HAVING句で集約結果の条件指定(COUNT(*) > 1)を行うことで重複を検出できます。
- 差がつくポイント:WHERE句は行単位の条件指定に使い、グループ化後の条件指定にはHAVING句を使う点を理解しているかが重要です。
正解の理由
選択肢アは「SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1」となっており、氏名でグループ化した後、同じ氏名が2件以上存在するグループだけを抽出しています。これにより、同姓同名の社員氏名を正確に抽出できるため正解です。
よくある誤解
WHERE句で重複条件を指定しようとするが、WHEREはグループ化前の行単位の条件指定にしか使えません。重複検出にはHAVING句が必須です。
解法ステップ
- 同姓同名の社員を抽出したいので、氏名でグループ化する必要があると考える。
- GROUP BY句で「氏名」を指定し、同じ氏名ごとに集約する。
- 集約したグループの中で、件数が2件以上のものを抽出するためHAVING句で「COUNT(*) > 1」を指定。
- SELECT句で氏名のみを抽出し、重複している氏名を一覧表示するSQL文を完成させる。
選択肢別の誤答解説
- ア: 正解。GROUP BYとHAVINGで重複氏名を抽出している。
- イ: WHERE句で「氏名 = 氏名」としているが、これは常に真で意味がなく、重複抽出には不適。
- ウ: イと同様にWHERE句の条件が無意味で、ORDER BYは並び替えで重複検出には関係ない。
- エ: COUNT(*)を表示しているがHAVING句がなく、重複の有無で絞り込めていないため重複氏名の抽出には不十分。
補足コラム
SQLで重複データを抽出する際は、GROUP BY句で集約し、HAVING句で集約結果に対する条件を指定するのが基本です。WHERE句は集約前の行単位の条件指定に使うため、重複検出には使えません。また、COUNT(*)はグループ内の行数を数える関数で、重複判定に便利です。
FAQ
Q: なぜWHERE句では重複を検出できないのですか?
A: WHERE句は集約前の各行に対する条件指定であり、グループ化後の集約結果には適用できないためです。
A: WHERE句は集約前の各行に対する条件指定であり、グループ化後の集約結果には適用できないためです。
Q: HAVING句とWHERE句の違いは何ですか?
A: WHERE句は集約前の行に対する条件指定、HAVING句はGROUP BYで集約した後のグループに対する条件指定に使います。
A: WHERE句は集約前の行に対する条件指定、HAVING句はGROUP BYで集約した後のグループに対する条件指定に使います。
関連キーワード: SQL, GROUP BY, HAVING, 重複抽出, 集約関数, COUNT, データベース