データベーススペシャリスト試験 2010年 午前210


次の SQL文と同じ検索結果が得られる SQL文はどれか。  
 SELECT DISTINCT TBL1.COL1 FROM TBL1 
   WHERE COL1 IN (SELECT COL1 FROM TBL2)
SELECT DISTINCT TBL1.COL1 FROM TBL1 
  UNION SELECT TBL2.COL1 FROM TBL2
SELECT DISTINCT TBL1.COL1 FROM TBL1 
  WHERE EXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
(正解)
SELECT DISTINCT TBL1.COL1 FROM TBL1, TBL2 
  WHERE TBL1.COL1 = TBL2.COL1 
  AND TBL1.COL2 = TBL2.COL2
SELECT DISTINCT TBL1.COL1 FROM TBL1 LEFT OUTER JOIN TBL2 
  ON TBL1.COL1 = TBL2.COL1

解説

次の SQL文と同じ検索結果が得られる SQL文はどれか。【午前2 解説】

要点まとめ

  • 結論:元のSQLは「TBL1のCOL1がTBL2のCOL1に存在する行を抽出」しており、イのEXISTS句を使ったSQLが同じ結果を返します
  • 根拠:IN句はサブクエリの結果に含まれる値を条件にするため、EXISTS句で同じ条件を表現可能です。
  • 差がつくポイント:UNIONやJOINの使い方を誤ると結果が変わるため、条件の意味を正確に理解し、EXISTSの使い方を押さえることが重要です。

正解の理由

元のSQLは「TBL1のCOL1がTBL2のCOL1に含まれているか」をIN句で判定しています。
イのSQLはEXISTS句を使い、TBL2にTBL1.COL1と一致する行が存在するかをチェックしており、IN句と同じ意味を持ちます。
したがって、イのSQLが元のSQLと同じ検索結果を返します。

よくある誤解

IN句とEXISTS句は似ていますが、UNIONやJOINを使うと結果が変わることがあります。
特にJOINは結合条件が増えると行数が増減しやすく、元の条件と異なる結果になることが多いです。

解法ステップ

  1. 元のSQLの意味を理解する:「TBL1.COL1がTBL2.COL1に存在する行を抽出」
  2. IN句の条件をEXISTS句に置き換えられるか検討する
  3. UNIONやJOINが条件に合致するかを確認し、結果の違いを考える
  4. 条件が完全に一致するSQLを選択する

選択肢別の誤答解説

  • ア: UNIONはTBL1.COL1とTBL2.COL1の全ての値を結合し重複排除するため、元のSQLの条件とは異なります。
  • イ: EXISTS句でTBL2に該当するCOL1が存在するかを判定し、元のIN句と同じ意味になるため正解です。
  • ウ: JOINでCOL1とCOL2の両方を条件にしているため、元のSQLの条件(COL1のみ)と異なり、結果が変わります。
  • エ: LEFT OUTER JOINはTBL1の全行を保持しつつ結合するため、TBL2に存在しない行も含まれ、元のSQLと異なります。

補足コラム

IN句とEXISTS句はどちらもサブクエリの結果を条件に使いますが、パフォーマンスやNULLの扱いで違いが出ることがあります。
一般的に、EXISTSは存在確認に適し、大量データのサブクエリでは効率的な場合があります。
また、JOINは結合結果の行数が増減するため、単純な存在チェックには向きません。

FAQ

Q: IN句とEXISTS句はどちらが速いですか?
A: データベースやデータ量によりますが、EXISTSは存在確認に特化しており、大量データでは高速な場合があります。
Q: UNIONはどんな時に使いますか?
A: 複数のSELECT結果を結合し、重複を排除したい時に使います。条件の絞り込みには不向きです。
Q: LEFT OUTER JOINとINNER JOINの違いは?
A: LEFT OUTER JOINは左テーブルの全行を保持し、右テーブルに一致しない場合はNULLを補う。INNER JOINは両テーブルの条件に合致する行のみ抽出します。

関連キーワード: SQL, IN句, EXISTS句, JOIN, UNION, サブクエリ, 条件式, データベース検索
← 前の問題へ次の問題へ →

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