exists
- 別テーブルの情報を抽出条件に使い、主テーブルの選択性が高い(絞り込み多)場合。
- 評価順番:親問い合わせ → 副問い合わせ
- 「主表フィルタの選択性が高い場合」、「主表側も従表側も選択性が低い場合」に使う。
join
- 別テーブルの情報を出力対象にしたい場合に使う
(別テーブルを抽出条件に使うだけの場合:exists、inを使う)。 - 「1:1」なら結果は同じだが、「1:N」の場合は結果が重複してしまう
(※ distinct、groupByを使えば良いが、処理コストが高い)。
in、existsの違い
- in:主問い合わせのwhereの前に処理される。
別テーブルの情報を抽出条件に使い、従テーブルの選択性が高い(絞り込み少)場合に使う。 - exists:主問い合わせの後で処理される。
- inに大量に重複データが含まれる場合はパフォーマンスが低下すると言われる
→ inは効率が悪いとも言われる。
→ inよりjoinを使う方が良いという意見もある。もしくは、inの中でdistinctを使う。 - INはOR条件のようなものなので、1つでもレコードが見つかった時点で処理を終了するEXISTSの方が早いのが一般的。
自己結合
- 同じテーブル同士を結合すること。
- 結合する2テーブルの区別が付かないことでエラーになり得るので、テーブルに一時的な名前を付ける。