平成25年度 秋期 システムアーキテクト試験 午前Ⅱ 問21
テクノロジ/データベース“社員”表から同姓同名が存在する社員の氏名を抽出する SQL 文はどれか。 〔社員〕(社員番号,氏名,生年月日,所属) 0001,新井 健二,1970-02-04,営業部 0002,鈴木 太郎,1975-03-13,総務部 0003,佐藤 宏,1981-07-11,技術部 0004,田中 博,1978-01-24,企画部 0005,鈴木 太郎,1968-11-09,営業部 (注:本サイトでは原問題の表を文字表記に変換しています)
出典:平成25年度 秋期 システムアーキテクト試験 午前Ⅱ 問21
- アSELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1
- イSELECT 氏名 FROM 社員 WHERE 氏名 = 氏名
- ウSELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 ORDER BY 氏名
- エSELECT 氏名, COUNT(*) FROM 社員 GROUP BY 氏名
正解:ア
解説
同姓同名の社員を抽出するには,氏名でグループ化(GROUP BY)した上で,同じ氏名のグループに含まれる行数が 2 以上(HAVING COUNT(*) > 1)であるものを抽出すればよいです。これにより,同一の氏名をもつ社員が複数存在する(同姓同名が存在する)氏名だけを絞り込むことができます。
選択肢ごとの解説
- ア正しい。氏名で GROUP BY し,同じ氏名の行数が 1 より多い(HAVING COUNT(*) > 1)ものを抽出することで,同姓同名が存在する社員の氏名を抽出できます。
- イ誤り。WHERE 氏名 = 氏名 は,各行自身の氏名列同士を比較する条件であり,常に真となるため,単に全ての氏名を抽出するだけで,同姓同名の絞り込みにはなりません。
- ウ誤り。WHERE 氏名 = 氏名 は常に真となる無意味な条件であり,ORDER BY を付けても全氏名を並べ替えて抽出するだけで,同姓同名の絞り込みにはなりません。
- エ誤り。氏名と件数を GROUP BY で集計して一覧表示するだけであり,HAVING 句などで件数が 2 以上のものに絞り込んでいないため,同姓同名でない社員の氏名も含めて全て抽出されてしまいます。