HOME > データベース技術

ソフトウェア開発平成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つ
      しかないので、常に“=”となりますので、同姓同名は出力
      されません。」

ユウト「はい。ありがとうございました。」

この分野の 《問題一覧》

データベース平成16年問21

ソフトウェア開発平成16年問71