副問合せを使用した問合せの解決26 / 50 問

以下の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では理解必須の論点です。

前後の問題