データベーススペシャリスト試験 2022年 午前209


SQL文1とSQL文2を実行した結果が同一になるために, 表Rが満たすべき必要十分な条件はどれか。   〔SQL文1〕
    SELECT * FROM R UNION SELECT * FROM R
  〔SQL文2〕
    SELECT * FROM R
値にNULLをもつ行は存在しない。
行数が0である。
重複する行は存在しない。(正解)
列数が1である。

解説

SQL文1とSQL文2を実行した結果が同一になるための条件【午前2 解説】

要点まとめ

  • 結論:SQL文1とSQL文2の結果が同じになるには、表Rに重複行が存在しないことが必要です。
  • 根拠:UNIONは重複行を排除して結果を返すため、重複行がなければUNIONの効果はなくなります。
  • 差がつくポイント:UNIONの動作理解と重複行の有無が結果に与える影響を正確に把握することが重要です。

正解の理由

SQL文1は「SELECT * FROM R UNION SELECT * FROM R」であり、表Rの全行を2回取得し、重複を排除して結果を返します。一方、SQL文2は単純に「SELECT * FROM R」で表Rの全行を返します。
UNIONは重複行を1つにまとめるため、表Rに重複行がなければ、2回取得しても結果は変わりません。つまり、重複行が存在しないことが必要十分条件です。
したがって、選択肢の中で「重複する行は存在しない。」が正解となります。

よくある誤解

UNIONは単に行数を増やすだけと思い込み、重複排除の効果を見落とすことがあります。
また、NULLの有無や列数はUNIONの結果に直接影響しません。

解法ステップ

  1. SQL文1の動作を理解する:UNIONは重複行を排除する集合演算である。
  2. SQL文2は単純に表Rの全行を返すことを確認する。
  3. 両者の結果が同じになる条件を考える。
  4. 重複行がなければ、UNIONの重複排除効果は無意味となり、結果は同じになる。
  5. よって、表Rに重複行が存在しないことが必要十分条件と判断する。

選択肢別の誤答解説

  • ア: 「値にNULLをもつ行は存在しない。」
    NULLの有無はUNIONの重複排除に影響しません。NULLを含む行も重複判定の対象です。
  • イ: 「行数が0である。」
    行数が0なら確かに結果は同じですが、これは必要十分条件ではなく特殊ケースです。
  • ウ: 「重複する行は存在しない。」
    重複行がなければUNIONの重複排除効果はなく、結果は同一になります。正解です。
  • エ: 「列数が1である。」
    列数はUNIONの結果に影響しません。複数列でも重複排除は行われます。

補足コラム

SQLのUNIONは集合演算の一つで、複数のSELECT文の結果を結合し、重複行を排除して返します。
一方、UNION ALLは重複排除を行わず、すべての行を返します。
重複行の有無を理解することは、SQLのパフォーマンス最適化や正確なデータ取得に役立ちます。

FAQ

Q: UNIONUNION ALLの違いは何ですか?
A: UNIONは重複行を排除して結果を返しますが、UNION ALLは重複を排除せず全行を返します。
Q: NULLを含む行は重複判定でどう扱われますか?
A: NULLは他のNULLと等しいとは限らず、DBMSによって扱いが異なりますが、多くの場合はNULL同士も重複とみなされます。

関連キーワード: SQL, UNION, 重複排除, 集合演算, SELECT文, データベース, NULL, 重複行
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ