平成20年 春期 基本情報技術者 午前 問58

“社員”表から、職務がプログラマである社員が5人未満の部署の部署コードを探すSQL文として、適切なものはどれか。
ここで、“社員”表は次の構造であり、各列にはナル値は含まれないものとする。

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

 ア  SELECT DISTINCT 部署コード FROM 社員 S1
      WHERE 5 > (SELECT COUNT(S2.社員番号) FROM 社員 S2
           WHERE S1.部署コード = S2.部署コード
           AND S2.職務 = ’プログラマ’)
 イ  SELECT DISTINCT 部署コード FROM 社員 S1
      WHERE 5 < (SELECT COUNT(S2.社員番号) FROM 社員 S2
           WHERE S1.部署コード = S2.部署コード
           AND S2.職務 <> ’プログラマ’)
 ウ  SELECT DISTINCT 部署コード FROM 社員 S1
      WHERE EXISTS (SELECT * FROM 社員 S2
           WHERE S1.部署コード = S2.部署コード
           AND S2.職務 = ’プログラマ’)
           GROUP BY S1.部署コード HAVING COUNT(*) < 5
 エ  SELECT DISTINCT 部署コード FROM 社員 S1
      WHERE S1.部署コード IN (SELECT S2.部署コード FROM 社員 S2
           WHERE S1.部署コード = S2.部署コード
           AND S2.職務 = ’プログラマ’
           GROUP BY S1.部署コード HAVING COUNT(*) < 5)


答え ア


解説
問題となっているSQL文は「“社員”表から任意の社員S1と選び、S1と同じ部署の社員(S2)の職務が’プログラマ’の人の数を数え、それが5人未満だったら、S1の部署コードを重複しないように出力する」になります。

まず、社員S1と同じ部署コードの社員S2を数えるSQLは、数を数えるCOUNTコマンドを使用して
 SELECT COUNT(S2.社員番号) FROM 社員 S2
      WHERE S1.部署コード = S2.部署コード)
になります。
ここに、社員S2がプログラマであるという条件を加えると、SQLは
 SELECT COUNT(S2.社員番号) FROM 社員 S2
      WHERE S1.部署コード = S2.部署コード)
      AND S2.職務 = ’プログラマ’)
になります。
この数が、5未満な場合なのでSQLとしては、
 WHERE 5 > (SELECT COUNT(S2.社員番号) FROM 社員 S2
      WHERE S1.部署コード = S2.部署コード
      AND S2.職務 = ’プログラマ’)
になります。
社員S1の部署コードを出力するSQLは
 SELECT 部署コード FROM 社員 S1
ですが、同じ部署コードを複数出力するのを防ぐため、重複行をまとめるDISTINCTコマンドを使用して、SQLは
 SELECT DISTINCT 部署コード FROM 社員 S1
になります。
これをまとめると
 SELECT DISTINCT 部署コード FROM 社員 S1
      WHERE 5 > (SELECT COUNT(S2.社員番号) FROM 社員 S2
           WHERE S1.部署コード=S2.部署コード
           AND S2.職務 = ’プログラマ’)

(ア)です。なお、社員S1と社員S2が同じ社員でもいいところに注意です。


キーワード
・SQL

キーワードの解説
  • SQL
    リレーショナルデータベースマネジメントシステム(RDBMS)において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)です。
    SQLを用いることで、表の定義やデータ操作、関係演算など、リレーショナルデータベースに関するほとんどの操作を機械可読なテキストとして記述できます。
    なお、SQLは「Structured Query Language」の略語ではありません。

もっと、「SQL」について調べてみよう。

戻る 一覧へ 次へ