ソフトウェア開発平成16年問71
問 題
“社員”表に存在する同姓同名の氏名を検索するSQL文として、適切なものはどれか。
社員 ┌────┬─────┬─────┬───┐ │社員番号│ 氏 名 │ 生年月日 │所 属│ ┝━━━━┿━━━━━┿━━━━━┿━━━┥ │ 0001 │新井 健二│1950-02-04│営業部│ ├────┼─────┼─────┼───┤ │ 0002 │鈴木 太郎│1955-03-13│総務部│ ├────┼─────┼─────┼───┤ │ 0003 │佐藤 宏 │1961-07-11│技術部│ ├────┼─────┼─────┼───┤ │ 0004 │田中 博 │1958-01-24│企画部│ ├────┼─────┼─────┼───┤ │ 0005 │鈴木 太郎│1948-11-09│営業部│ ├────┼─────┼─────┼───┤ │ : │ : │ : │ : │ └────┴─────┴─────┴───┘
ア SELECT DISTINCT 氏名 FROM 社員 ORDER BY 氏名
イ SELECT 氏名, COUNT(*) FROM 社員 GROUP BY 氏名
ウ SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1
エ SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名
(SWH16年問71)
解 説
(SWH16年問71)難易度 ★★
解答
ウ SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1
長 池「今日は、日頃の業務の成果を見てみようかな。
SQLの問題だよ。いつも業務で使っているから解けるよね。」
ユウト「はい。MS-ACCESSでデータベースから必要な情報を取得するために、
SQLを使っていますからね。」
長 池「そうだね。それじゃ、早速解いてもらおうかな。」
ユウト「はい。
“社員”表から、同姓同名も氏名を検索するということですから、
氏名でグループ化して、その件数が2件以上の氏名を取り出せば
いいことになります。」
長 池「おぉ。いい感じだね。」
ユウト「まずは、SQLの基本構文、SELECT FROM
に当てはめてみます。
取得したいのは、氏名ですので、
SELECTには、“氏名”が入ります。
SELECT 氏名
次に、どのテーブルから取得するかは、社員表ですので、
FROM 社員表
となります。」
長 池「それじゃ、キモとなる取得条件のところをやってみてもらえるかな。」
ユウト「はい。
社員表の氏名が一致するという条件でグループ化します。
GROUP BY 氏名
です。
その件数が2件以上という条件が必要となりますので、
COUNT(*)>1という条件を付記します。」
長 池「それで合ってるかな?
選択肢を見てごらん。」
ユウト「あれ?
選択肢に該当するものがありません。(涙)」
長 池「いいところまで行ったんだけどなぁ。
グループ化した結果に対する選択条件は、COUNT(*)ではなくて、
HAVING句を用いるんだよ。
このHAVING句の使い方をよく理解できていない人が多いよね。
初級シスアドの午後問題では、頻出問題だからね。
しっかり理解しておこうね。」
ユウト「あぁ。HAVING句ですかあ。
GROUP BYの後には、HAVING句が来るんですね。」
長 池「正解は、ウになるよね。
その他の選択肢についても見ておこう。
ア:氏名でソートして、重複する氏名を排除します。
つまり、社員表に存在する氏名がソートされて出力されます。
イ:氏名でグループ化した結果を出力します。
同姓同名以外の氏名も出力されます。
エ:氏名と氏名の比較を行っていますが、1つの行に氏名は1つ
しかないので、常に“=”となりますので、同姓同名は出力
されません。」
ユウト「はい。ありがとうございました。」