コンテンツ
SQLを使用する上での一定の課題は、EXISTSおよびIN演算子の適切な使用方法を決定することです。 2つの演算子で同じ結果が得られますが、常にそうとは限りません。さらに、各オペレータがどのように速度を最適化するかについてもかなりの議論があります。ユーザーは各演算子のさまざまな属性を理解し、適切な使用法を決定するために2つを試してみる必要があります。
EXISTSまたはINを選択するときは、SQLの目標を考慮してください。 (Jupiterimages / Photos.com / Getty Images)
IN演算子
IN演算子は、テーブルのフィールド値がIN値のリストのWHERE条件を満たす場合に行を返します。通常、メインクエリの一部として、またはサブクエリと共に使用されます。
例1:WHERE table.field IN( 'a'、 'b'、 'c')例2:WHERE table.field IN(集合を返す副照会)
EXISTSオペレーター
副問合せに行が含まれている場合、EXISTS演算子はすべての主要行を返します。副問合せと組み合わせてのみ使用されます。返される行は、メインクエリのフィルタによって決まります。
例:WHERE EXISTS(集合を返す副問合せ)
違い
IN演算子はNULL値を評価できないため、NULL値を含む行を評価して返すEXISTS演算子とは異なり、このような行は常にfalseになり返されません。
類似点
EXISTSとINの両方とも、相関サブクエリと非相関サブクエリをサポートしており、どちらも同様の結果を生成できます。相互に関連付けられている場合、それらはサブクエリーフィールドのメインクエリーフィールドを満たします(例:principal.id = subquery.id)。副照会は、検出されたオカレンスごとに、行ごとに評価します。この場合、INとEXISTSは同様の "id"条件に基づいて同じ行を返します。相関がない場合、2つの演算子はそれぞれの副照会を処理してから主照会の結果を結合します。
パフォーマンス
パフォーマンスは、データベースオプティマイザと実行コードに使用される実行計画によって決まります。 EXISTSとINの場合、オプティマイザは異なるパスを選択できます。 Oracleでは、NOT EXISTSは通常NOT INよりも高速です。結局、使用されているデータベースとバージョンに応じて、最短パスをソートするためにいくつかの試みとエラーが必要です。最初に正しい結果を保証する演算子を必ず使用してから、演算子を置き換えてどれが最も速いかを確認してください。