SAシステムアーキテクト試験 午前Ⅱ

平成25年度秋期 システムアーキテクト 午前Ⅱ 問21

問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。

問題

“社員”表から同姓同名が存在する社員の氏名を抽出するSQL文はどれか。
社員番号,氏名,生年月日,所属を示す社員表。鈴木太郎が社員番号0002と0005の2行に存在する。
社員番号,氏名,生年月日,所属を示す社員表。鈴木太郎が社員番号0002と0005の2行に存在する。

選択肢

  1. ア
    SELECT 氏名 FROM 社員 GROUP BY 氏名 HAVING COUNT(*) > 1
  2. イ
    SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名
  3. ウ
    SELECT 氏名 FROM 社員 WHERE 氏名 = 氏名 ORDER BY 氏名
  4. エ
    SELECT 氏名、 COUNT(*) FROM 社員 GROUP BY 氏名
解き方のヒントを見る

抽出条件を読むための一つの視点

SQLの結果を考えるときは、文中の各条件がどの段階で対象を絞る役割を持つかに注目し、対象となる行の変化を順に追って、表示される情報との対応を落ち着いて確認しましょう。

この問題で問われていること

一つの観点として、処理の途中で候補となるデータがどのように扱われるかを、条件ごとに区切って確認してください。最終結果だけを直感で判断せず、各段階で残る対象と表示項目を問題文と照らし合わせます。

視点

抽出結果を検討する際は、条件、対象、表示内容をそれぞれ分けて捉え、文の構造に沿ってデータの流れを整理します。個別の答えを先に決めず、根拠となる記述同士の対応を確認することで、読み落としや思い込みを避けられます。

確認ポイント

  • 各条件がどの対象に関係しているか確認する
  • 処理の順序を区切って対象の変化を追う
  • 最終表示と根拠となる記述を照合する
正解と解説を見る

正解

ア

解説

同姓同名の社員を抽出するには、氏名が同じ行を氏名ごとにグループ化し、そのグループの行数が2以上であるものだけを残します。GROUP BYとCOUNTに加えて、集約結果を絞り込む条件指定が必要です。

理由

氏名ごとにGROUP BYでまとめ、COUNT(*)で各氏名の社員数を数え、HAVING COUNT(*) > 1で複数人いる氏名だけを抽出します。したがって正答はアです。

比較

WHEREはグループ化前の各行を対象にする条件であり、HAVINGはGROUP BY後の集約結果を対象にします。ORDER BYは並び順を変えるだけで、重複の判定は行いません。

選択肢ア(正解)

これは正解だよ。GROUP BY 氏名で同じ氏名の行をまとめ、COUNT(*)で各氏名の人数を数えています。さらにHAVING COUNT(*) > 1で、社員が2人以上存在する氏名だけを抽出しているため、同姓同名の氏名を求める条件に一致します。

選択肢イ

これは不正解だよ。WHERE 氏名 = 氏名は、通常の値であれば各行自身の氏名と同じなので、重複の有無に関係なく行を選びます。別の行に同じ氏名が存在するかを数える処理や、複数件だけに絞る条件がありません。

選択肢ウ

これは不正解だよ。WHERE 氏名 = 氏名によって、同姓同名かどうかではなく各行自身の値を比較しています。ORDER BY 氏名は結果の並び順を氏名順にするだけで、同じ氏名が複数存在するかを判定する機能はありません。

選択肢エ

これは不正解だよ。GROUP BY 氏名とCOUNT(*)により、氏名ごとの人数を集計するところまでは適切です。しかし集計結果を2件以上に限定する条件がないため、社員が1人だけの氏名も含まれ、同姓同名だけの抽出にはなりません。

学習のポイント

GROUP BY、COUNT、HAVINGの役割の違いを理解しましょう。

出典:独立行政法人 情報処理推進機構(IPA)平成25年度秋期 システムアーキテクト試験 午前Ⅱ 問21(公式資料:問題冊子(PDF) / 解答例)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針