平成20年春期試験問題 午前問58

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
"社員"表から,職務がプログラマである社員が5人未満の部署の部署コードを探すSQL文として,適切なものはどれか。ここで,"社員"表は次の構造であり,各列にはナル値は含まれないものとする。

 社員 (社員番号, 社員名, 部署コード, 職務)

  • 58a.gif
  • 58i.gif
  • 58u.gif
  • 58e.gif
正解 問題へ
分野:テクノロジ系
中分類:データベース
小分類:データ操作
解説
  • 正しい。以下の副問合せでは、現在の主問合せ側の行の部署コードをもつ行を抽出し、その中で職務がプログラマである行の数を返します。
    SELECT COUNT(S2.社員番号) FROM 社員 S2
     WHERE S1.部署コード = S2.部署コード
      AND S2.職務 = 'プログラマ'
    副問合せから返された値が5未満であれば、主問合せ側のWHERE句は真を返します。この処理の結果、所属するプログラマが5人未満である部署コードをもつ行のみが抽出されるため、後はこの中間表からSELECT句で部署コードを抜き出し、DISDINCT句で重複行を排除することになります。
  • 「ア」のSQL文と比較して「WHERE <」と「S2.職務<>'プログラマ'」の部分が異なります。この文を実行すると、プログラマでない社員が5人より多い部署コードを取り出すことになります。
  • EXISTS句では以下の副問合せによって同じ部署内にプログラマがいる全ての行が抽出されます。
    SELECT * FROM 社員 S2
     WHERE S1.部署コード = S2.部署コード
      AND S2.職務 = 'プログラマ'
    「HAVING COUNT(*) < 5」では、この行数を基準に抽出対象を絞っているため、たとえプログラマが5人未満であっても所属する社員数が5人以上であればその部署は抽出されません。またプログラマが0人の部署もEXISTS句が偽を返すため抽出されません。したがって誤りです。
  • 以下の副問合せでは、現在の主問合せ側の行の部署コードをもつ行を抽出し、その中で職務がプログラマである行を抽出します。
    SELECT S2.部署コード FROM 社員 S2
     WHERE S1.部署コード = S2.部署コード
      AND S2.職務 = 'プログラマ'
       GROUP BY S2.部署コード HAVING COUNT(*) < 5
    プログラマが1人以上5人未満の部署コードは抽出されますが、0人の部署はWHERE句の条件に合致せず抽出されません。したがって誤りです。

Pagetop