概要:このチュートリアルでは、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演算子を使用する方法を学習しました。