システムアーキテクト試験 2013年 午前221


“社員”表から同姓同名が存在する社員の氏名を抽出する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句が必須です。

解法ステップ

  1. 同姓同名の社員を抽出したいので、氏名でグループ化する必要があると考える。
  2. GROUP BY句で「氏名」を指定し、同じ氏名ごとに集約する。
  3. 集約したグループの中で、件数が2件以上のものを抽出するためHAVING句で「COUNT(*) > 1」を指定。
  4. SELECT句で氏名のみを抽出し、重複している氏名を一覧表示するSQL文を完成させる。

選択肢別の誤答解説

  • ア: 正解。GROUP BYとHAVINGで重複氏名を抽出している。
  • イ: WHERE句で「氏名 = 氏名」としているが、これは常に真で意味がなく、重複抽出には不適。
  • ウ: イと同様にWHERE句の条件が無意味で、ORDER BYは並び替えで重複検出には関係ない。
  • エ: COUNT(*)を表示しているがHAVING句がなく、重複の有無で絞り込めていないため重複氏名の抽出には不十分。

補足コラム

SQLで重複データを抽出する際は、GROUP BY句で集約し、HAVING句で集約結果に対する条件を指定するのが基本です。WHERE句は集約前の行単位の条件指定に使うため、重複検出には使えません。また、COUNT(*)はグループ内の行数を数える関数で、重複判定に便利です。

FAQ

Q: なぜWHERE句では重複を検出できないのですか?
A: WHERE句は集約前の各行に対する条件指定であり、グループ化後の集約結果には適用できないためです。
Q: HAVING句とWHERE句の違いは何ですか?
A: WHERE句は集約前の行に対する条件指定、HAVING句はGROUP BYで集約した後のグループに対する条件指定に使います。

関連キーワード: SQL, GROUP BY, HAVING, 重複抽出, 集約関数, COUNT, データベース
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ