ホーム > データベーススペシャリスト試験 > 2010年
データベーススペシャリスト試験 2010年 午前2 問10
次の 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と同じ検索結果を返します。
イのSQLはEXISTS句を使い、TBL2にTBL1.COL1と一致する行が存在するかをチェックしており、IN句と同じ意味を持ちます。
したがって、イのSQLが元のSQLと同じ検索結果を返します。
よくある誤解
IN句とEXISTS句は似ていますが、UNIONやJOINを使うと結果が変わることがあります。
特にJOINは結合条件が増えると行数が増減しやすく、元の条件と異なる結果になることが多いです。
特にJOINは結合条件が増えると行数が増減しやすく、元の条件と異なる結果になることが多いです。
解法ステップ
- 元のSQLの意味を理解する:「TBL1.COL1がTBL2.COL1に存在する行を抽出」
- IN句の条件をEXISTS句に置き換えられるか検討する
- UNIONやJOINが条件に合致するかを確認し、結果の違いを考える
- 条件が完全に一致する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は結合結果の行数が増減するため、単純な存在チェックには向きません。
一般的に、EXISTSは存在確認に適し、大量データのサブクエリでは効率的な場合があります。
また、JOINは結合結果の行数が増減するため、単純な存在チェックには向きません。
FAQ
Q: IN句とEXISTS句はどちらが速いですか?
A: データベースやデータ量によりますが、EXISTSは存在確認に特化しており、大量データでは高速な場合があります。
A: データベースやデータ量によりますが、EXISTSは存在確認に特化しており、大量データでは高速な場合があります。
Q: UNIONはどんな時に使いますか?
A: 複数のSELECT結果を結合し、重複を排除したい時に使います。条件の絞り込みには不向きです。
A: 複数のSELECT結果を結合し、重複を排除したい時に使います。条件の絞り込みには不向きです。
Q: LEFT OUTER JOINとINNER JOINの違いは?
A: LEFT OUTER JOINは左テーブルの全行を保持し、右テーブルに一致しない場合はNULLを補う。INNER JOINは両テーブルの条件に合致する行のみ抽出します。
A: LEFT OUTER JOINは左テーブルの全行を保持し、右テーブルに一致しない場合はNULLを補う。INNER JOINは両テーブルの条件に合致する行のみ抽出します。
関連キーワード: SQL, IN句, EXISTS句, JOIN, UNION, サブクエリ, 条件式, データベース検索