以下のSQL文で、どのような結果が返されますか。
SELECT employee_id, department_id FROM employees e
WHERE salary > (
SELECT AVG(salary) FROM employees d
WHERE d.department_id = e.department_id
);A全従業員のリスト
B同じ部署で最高給与の従業員リスト
C同じ部署で平均給与以上の従業員リスト✓
D同じ部署で平均給与以下の従業員リスト
正解:C解説
相関副問合せで同じ部署内の平均給与を算出し、それより高い給与を持つ従業員を抽出しています。
相関副問合せ(Correlated Subquery)の特徴
副問合せ内から外側のクエリの列を参照する形態です。今回は内側のd.department_id = e.department_idで、外側の従業員eの部署IDを参照しています。
処理イメージ
外側のemployees e を1行ずつ処理:
e.employee_id = 1, e.department_id = 10 のとき
→ 内側: SELECT AVG(salary) FROM employees WHERE department_id = 10
→ 部署10の平均給与と e.salary を比較
e.employee_id = 2, e.department_id = 20 のとき
→ 内側: SELECT AVG(salary) FROM employees WHERE department_id = 20
→ 部署20の平均給与と e.salary を比較
... 以下、全行に対して内側のクエリが実行される通常の副問合せとの違い
| 種類 | 副問合せの実行回数 | 用途 |
|---|---|---|
| 通常の副問合せ | 1回(最初に1回だけ) | 「全社の平均」のような単一の集計値を比較 |
| 相関副問合せ | 行ごとに実行 | 「自分の所属グループでの集計」と比較する場合 |
相関副問合せはパフォーマンスが落ちやすい構文ですが、Silver SQLでは理解必須の論点です。