データベーススペシャリスト 2011年 午前2 問05
問題文
“社員番号” と “氏名” を列としてもつR表とS表に対して、差 (R-S) を求めるSQL 文はどれか。ここで、R 表とS 表の主キーは“社員番号”であり、“氏名”は“社員番号”に関数従属する。
選択肢
ア:
SELECT R.社員番号、 S.氏名 FROM R, S
WHERE R. 社員番号 <> S. 社員番号
イ:
SELECT 社員番号、 氏名 FROM R
UNION SELECT 社員番号、 氏名 FROM S
ウ:
SELECT 社員番号、 氏名 FROM R
WHERE NOT EXISTS (SELECT FROM S
WHERE R. 社員番号 = S. 社員番号)
(正解)エ:
SELECT 社員番号、 氏名 FROM S
WHERE S.社員番号 NOT IN (SELECT 社員番号 FROM R
WHERE R.社員番号= S.社員番号)
“社員番号” と “氏名” を列としてもつR表とS表に対して、差 (R-S) を求めるSQL 文はどれか【午前2 解説】
要点まとめ
- 結論:R表に存在しS表に存在しない社員番号の行を抽出するには、NOT EXISTS句を使うSQL文が正解です。
- 根拠:差集合(R-S)は「Rの行のうちSに存在しないもの」を意味し、主キーである社員番号を基に存在チェックを行う必要があります。
- 差がつくポイント:単純な結合やUNIONでは差集合は表現できず、NOT EXISTSやNOT INで存在しない行を正確に抽出する理解が重要です。
正解の理由
選択肢ウは、R表の各行に対してS表に同じ社員番号が存在しないことを
NOT EXISTSで確認しています。これにより、R表にあってS表にない行だけを抽出でき、差集合(R-S)を正しく求めています。主キーである社員番号を条件にしているため、氏名の関数従属性も問題になりません。
よくある誤解
- 単純な結合条件で差集合を求められると誤解しがちですが、結合は共通部分や全体集合を扱うため差集合には不向きです。
- UNIONは集合の和集合を求めるため、差集合とは逆の結果になります。
解法ステップ
- 差集合とは「RにあってSにない」行の集合であることを理解する。
- 主キーである社員番号を基準に、S表に存在しない社員番号をR表から抽出する必要がある。
- SQLで存在チェックを行う方法として
NOT EXISTS
やNOT IN
があることを確認する。 - 選択肢のSQL文を読み、R表の行に対してS表に同じ社員番号が存在しないことを条件にしている文を選ぶ。
- それが選択肢ウであることを判断する。
選択肢別の誤答解説
- ア:
WHERE R.社員番号 <> S.社員番号
は全ての社員番号が異なる組み合わせを抽出し、差集合とは無関係な結果になる。 - イ:
UNION
はRとSの和集合を求めるため、差集合の条件を満たさない。 - ウ: 正解。RにあってSにない社員番号を
NOT EXISTS
で正しく抽出している。 - エ: S表からR表に存在しない社員番号を抽出しており、差集合の方向が逆(S-R)になっている。
補足コラム
SQLで集合演算を行う際、差集合は
EXCEPT句を使うこともありますが、全てのDBMSでサポートされているわけではありません。
NOT EXISTSや
NOT INは互換性が高く、主キーを使った存在チェックに適しています。また、NULL値の扱いに注意が必要で、
NOT INはNULLが含まれると意図しない結果になることがあります。
FAQ
Q: 差集合を求めるのに
A: 一般的に
NOT INと
NOT EXISTSはどちらが良いですか?
A: 一般的に
NOT EXISTSの方がNULLの影響を受けにくく、パフォーマンスも良い場合が多いです。
Q: 主キー以外の列で差集合を求めることはできますか?
A: 可能ですが、主キー以外の列で比較すると重複や不整合が起きやすいため、主キーを基準にするのが安全です。
A: 可能ですが、主キー以外の列で比較すると重複や不整合が起きやすいため、主キーを基準にするのが安全です。
関連キーワード: SQL 差集合、NOT EXISTS, 主キー、集合演算、SQL文解説

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

