SQL相関サブクエリ
概要:このチュートリアルでは、外部クエリの値を使用するサブクエリであるSQL相関サブクエリについて学習します。
SQL相関サブクエリの概要
例から始めましょう。
サンプルデータベースの次のemployees
テーブルを参照してください。

次のクエリは、給与がすべての従業員の平均給与よりも大きい従業員を検索します。
SELECT employee_id, first_name, last_name, salaryFROM employeesWHERE salary > (SELECT AVG(salary) FROM employees);


SELECT employee_id, first_name, last_name, salaryFROM employeesWHERE salary > (SELECT AVG(salary) FROM employees);

この例では、サブクエリはWHERE
句で使用されます。 このクエリから見ることができるいくつかのポイントがあります:
まず、すべての従業員の平均給与を個別に返すサブクエリを実行できます。
SELECT AVG(salary)FROM employees;
第二に、データベースシステムは一度だけサブクエリを評価する必要があります。
第三に、外部クエリは、サブクエリから返された結果を使用します。 外部クエリは、その値のサブクエリに依存します。 ただし、サブクエリは外部クエリには依存しません。 場合によっては、このサブクエリをプレーンサブクエリと呼びます。
通常のサブクエリとは異なり、相関サブクエリは外部クエリの値を使用するサブクエリです。 また、相関サブクエリは、外部クエリによって選択された行ごとに一度評価されてもよい。 このため、相関サブクエリを使用するクエリが遅くなる可能性があります。
相関サブクエリは、繰り返しサブクエリまたは同期サブクエリとも呼ばれます。
SQL相関サブクエリの例
相関サブクエリをよりよく理解するために、相関サブクエリの例をいくつか見てみましょう。
WHERE句の例のSQL相関サブクエリ
次のクエリでは、給与が部門の従業員の平均給与よりも高いすべての従業員が検索されます。
SELECT employee_id, first_name, last_name, salary, department_idFROM employees eWHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)ORDER BY department_id , first_name , last_name;
次の出力は次のとおりです。
SELECT employee_id, first_name, last_name, salary, department_idFROM employees eWHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)ORDER BY department_id , first_name , last_name;
:

この例では、外部クエリは次のとおりです。
SELECT employee_id, first_name, last_name, salary, department_idFROM employees eWHERE salary >...
相関サブクエリは次のとおりです。
SELECT employee_id, first_name, last_name, salary, department_idFROM employees eWHERE salary >...
各従業員について、データベースシステムは、現在の従業員の部門の従業員の平均給与を計算するために、相関サブクエリを一度実行する必要
SELECT句のSQL相関サブクエリの例
次のクエリは、従業員とその部門のすべての従業員の平均給与を返します。
SELECT employee_id, first_name, last_name, department_name, salary, (SELECT ROUND(AVG(salary),0) FROM employees WHERE department_id = e.department_id) avg_salary_in_departmentFROM employees e INNER JOIN departments d ON d.department_id = e.department_idORDER BY department_name, first_name, last_name;
出力は次のとおりです。

各従業員について、データベースシステムは相関サブクエリを一度実行して、従業員の部門別の平均給与を計算する必要があります。
EXISTS演算子を使用したSQL相関サブクエリの例
EXISTS
演算子を使用した相関サブクエリを使用することがよくあります。 たとえば、次のクエリは、依存関係のないすべての従業員を返します。
SELECT employee_id, first_name, last_nameFROM employees eWHERE NOT EXISTS( SELECT * FROM dependents d WHERE d.employee_id = e.employee_id)ORDER BY first_name , last_name;
次の図は、出力を示しています。

このチュートリアルでは、sql相関サブクエリと、それを適用して複雑なクエリを形成する方法について学習しました。
- このチュートリアルは役に立ちましたか?
div
Leave a Reply