概要:このチュートリアルでは、SQLのEXISTS
演算子を使用して、サブクエリに任意の行が含まれているかどうかをテストする方法を学習します。
SQL EXISTS演算子の紹介
EXISTS
演算子を使用すると、行の存在をテストするためのサブクエリを指定できます。以下は、EXISTS
演算子の構文を示しています。
EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
サブクエリに任意の行が含まれている場合、EXISTS
演算子はtrueを返します。それ以外の場合は、falseを返します。
EXISTS
演算子は、行が見つかり次第、クエリ処理を直ちに終了します。そのため、EXISTS
演算子のこの機能を利用して、クエリのパフォーマンスを向上させることができます。
SQL EXISTS演算子の例
サンプルデータベースのemployees
テーブルとdependents
テーブルをデモに使用します。

次のステートメントは、少なくとも1人の扶養家族がいるすべての従業員を見つけます。
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
Code language: SQL (Structured Query Language) (sql)

サブクエリは相関しています。employees
テーブルの各行について、サブクエリはdependents
テーブルに対応する行があるかどうかをチェックします。ある場合は、サブクエリは1を返し、外部クエリはemployees
テーブルの現在の行を含めます。対応する行がない場合、サブクエリは行を返さず、外部クエリは結果セットにemployees
テーブルの現在の行を含めません。
SQL NOT EXISTS
EXISTS
演算子を否定するには、次のようにNOT
演算子を使用します。
NOT EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
たとえば、次のクエリは、扶養家族がいない従業員を見つけます。
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
NOT EXISTS( SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id);
Code language: SQL (Structured Query Language) (sql)
次のスクリーンショットは結果を示しています。

SQL EXISTSとNULL
サブクエリがNULL
を返す場合でも、EXISTS
演算子は結果セットを返します。これは、EXISTS
演算子がサブクエリによって返される行の存在のみをチェックするためです。行がNULL
であるかどうかに関係ありません。
次の例では、サブクエリはNULL
を返しますが、EXISTS
演算子はtrueと評価されます。
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS( SELECT NULL)
ORDER BY first_name , last_name;
Code language: SQL (Structured Query Language) (sql)
クエリはemployees
テーブルのすべての行を返します。
このチュートリアルでは、サブクエリによって返される行の存在をテストするためにSQL EXISTS
演算子を使用する方法を学習しました。