データベーススペシャリスト 2016年 午前2 問09
問題文
次の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に存在するかどうかを
イのSQL文は
また、両者とも
IN句で判定し、重複を除いて抽出しています。イのSQL文は
EXISTS句を使い、TBL2にTBL1のCOL1と一致する行が存在するかをチェックしています。EXISTSは条件に合う行があれば真となるため、元のIN句と同じ意味を持ちます。また、両者とも
DISTINCTで重複排除しているため、結果は完全に一致します。解法ステップ
- 元SQL文の意味を理解する:「TBL1.COL1がTBL2.COL1に存在する行を抽出」
IN句の役割を確認:サブクエリの結果に含まれるかどうかの存在確認- 選択肢のSQL文の動作を一つずつ検証
EXISTS句は存在確認に使われ、IN句と同等の結果を返すことを知るUNIONやJOINは結果の意味が異なるため除外- よってイが正解と判断する
選択肢別の誤答解説
- ア:
UNIONはTBL1とTBL2のCOL1の値を結合し、重複を除いた結果を返すため、元SQLの「TBL1の値がTBL2に存在する」条件とは異なります。 - イ:
EXISTS句でTBL2にTBL1.COL1と一致する行が存在するかを判定し、元SQLと同じ結果を返します。 - ウ:
TBL1とTBL2を結合し、さらにCOL2の一致も条件にしているため、元SQLより条件が厳しくなり結果が異なります。 - エ:
LEFT OUTER JOINはTBL1の全行を返し、TBL2に一致する行がなくてもNULLで返すため、元SQLの存在チェックとは異なります。
よくある誤解
UNIONは2つのテーブルの値を結合する操作であり、元のIN句の存在チェックとは異なります。JOINは結合条件により行を増やす可能性があり、単純な存在チェックとは意味が違います。補足コラム
IN句はサブクエリの結果に値が含まれるかを判定し、EXISTS句はサブクエリの行の存在を判定します。- パフォーマンス面では、
EXISTSの方が効率的な場合もありますが、結果は同じです。 JOINはテーブルを結合して行を増やす操作であり、単純な存在チェックとは用途が異なります。
FAQ
Q:
A: 結果は同じですが、データ量やインデックスの有無によってパフォーマンスが変わるため、状況に応じて使い分けます。
IN句とEXISTS句はどちらを使うべきですか?A: 結果は同じですが、データ量やインデックスの有無によってパフォーマンスが変わるため、状況に応じて使い分けます。
Q:
A: 複数のSELECT文の結果を結合し、重複を除いて一つの結果セットにまとめたい時に使います。
UNIONはどんな時に使いますか?A: 複数のSELECT文の結果を結合し、重複を除いて一つの結果セットにまとめたい時に使います。
関連キーワード: SQL, サブクエリ、EXISTS句、IN句、JOIN, UNION, DISTINCT, データベース検索

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

