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