データベーススペシャリスト 2022年 午前2 問09
問題文
SQL文1とSQL文2を実行した結果が同一になるために、表Rが満たすべき必要十分な条件はどれか。
〔SQL文1〕
SELECT * FROM R UNION SELECT * FROM R
〔SQL文2〕
SELECT * FROM R
選択肢
ア:値にNULLをもつ行は存在しない。
イ:行数が0である。
ウ:重複する行は存在しない。(正解)
エ:列数が1である。
🔒 解説は解答すると表示されます
UNIONの重複排除【午前2解説】
正解の理由
SQL の
UNION は結合結果から重複行を取り除く操作です。したがって、SELECT * FROM R UNION SELECT * FROM R は表 R の「重複を排除した集合」を返します。一方 SELECT * FROM R は表 R に含まれる行(重複を含む)をそのまま返します。両者が常に一致するためには、R に重複する行が存在しないこと、すなわち各行が一意である必要があります。したがって選択肢のうち正しいのは ウ(重複する行は存在しない)です。(補足:NULL を含むか否かは重複判定の妨げになりません。SQL の重複排除では NULL 同士は等しいものとして扱われます。)
解法ステップ
UNIONの意味を確認する:複数の SELECT 結果を結合し、重複行を排除する。- 問題の SQL1 は同じ表 R を 2 回
UNIONしているため、結果は R の「重複を取り除いた集合」と等しい。 - SQL2 は R の元の行全て(重複を含む)を返す。
- よって、ふたつの結果が一致する条件は「R に重複行がない(R = distinct(R))」であることを導く。
数式的には、distinct(R) = R が成立することが必要かつ十分です。
選択肢別の誤答解説
-
ア: 値にNULLをもつ行は存在しない。
誤り。NULL を含む行があっても、その行がテーブル内で重複していなければ問題ありません。重複排除の判定では NULL 同士は等しいものとして扱われるため、NULL の有無自体は条件ではありません。 -
イ: 行数が0である。
不適切。空表(行数0)は確かに両者一致しますが、必要十分条件ではありません。非空でも各行が一意であれば両者は一致します。したがって「行数が0である」は十分条件の一例に過ぎず、必要条件ではありません。 -
ウ: 重複する行は存在しない。
正しい。R に重複がないとき、UNIONは何も除去せず元の行集合と一致します。これが必要かつ十分の条件です。 -
エ: 列数が1である。
無関係。列数がいくつであっても、重複の有無が一致の鍵です。列数1であれば重複判定は単一列で行われますが、列数自体は必須条件ではありません。
よくある誤解
- UNION と UNION ALL を混同する:
UNION ALLは重複を排除しないため、同じ表を結合すると通常は行が倍増します。結果が一致するのは R が空のときだけです。 - NULL は重複判定の対象外であるという誤り:重複判定では NULL 同士は等しいと見なされます(NULL の存在が自動的に不一致を生むわけではありません)。
- 「重複」の意味を列の一部に限定して考える誤り:重複判定は SELECT で出力される全列の値が一致するかで判断されます。部分列だけが同じでも全列が同一でなければ重複とは見なされません。
補足コラム
- UNION と DISTINCT の関係:
SELECT DISTINCT * FROM Rは R の重複を取り除いた結果を返します。SELECT * FROM R UNION SELECT * FROM Rは概念的にSELECT DISTINCT * FROM Rと同等です。 - UNION ALL の扱い:
UNION ALLは重複排除を行いません。したがってSELECT * FROM R UNION ALL SELECT * FROM Rの結果は、通常 R の各行が 2 回ずつ現れる(行数が 2 倍になる)ことになります。元のSELECT * FROM Rと一致するのは R が空のときのみです。 - 重複の判定基準:SQL の重複排除は SELECT で指定した列全体の値一致で判定されます。型や列順が同一であることも前提です(
SELECT *同士の比較なので通常は列順・列数は一致します)。
(例)簡単なデータでの比較
-- R の内容
-- id | name
-- 1 | 'A'
-- 1 | 'A'
-- 2 | 'B'
-- SELECT * FROM R の結果
-- (1,'A'), (1,'A'), (2,'B')
-- SELECT * FROM R UNION SELECT * FROM R の結果
-- (1,'A'), (2,'B') -- 重複が取り除かれる
FAQ
Q1: 主キーや一意制約があれば条件を満たしますか?
A1: はい。表に主キーまたは一意制約があり、それが行の重複を防いでいれば、重複行は存在しないため条件を満たします。
A1: はい。表に主キーまたは一意制約があり、それが行の重複を防いでいれば、重複行は存在しないため条件を満たします。
Q2: 列の並び順や型の差で影響はありますか?
A2: 問題中は同じ表 R を同列で選択しているため影響しません。一般に UNION の重複判定は出力される列の組み合わせに対して行われます。
A2: 問題中は同じ表 R を同列で選択しているため影響しません。一般に UNION の重複判定は出力される列の組み合わせに対して行われます。
Q3: NULL を含む行の扱いは?
A3: 重複判定では NULL 同士は等しいとみなされるため、NULL の存在自体は一致・不一致の直接要因にはなりません。
A3: 重複判定では NULL 同士は等しいとみなされるため、NULL の存在自体は一致・不一致の直接要因にはなりません。
関連キーワード: SQL、UNION、UNION ALL、DISTINCT、重複排除、NULLの扱い、集合演算、多重集合、重複行判断

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

