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

以下のSQL文で、どのような結果が返されますか。

SELECT employee_id, salary, department_id FROM employees e
WHERE department_id IN (
  SELECT department_id FROM departments WHERE location_name = 'TOKYO'
)
AND salary = (
  SELECT MAX(salary) FROM employees es 
  WHERE es.department_id = e.department_id
);
A全従業員リスト
B東京部署の従業員リスト
C東京の各部署で最も給与が高い従業員リスト✓
D東京の各部署か最も給与が高い従業員リスト
正解:C解説

2つの条件をANDで組み合わせたSQLです。順に見ていきます。
条件1:東京にある部署か?

department_id IN (
  SELECT department_id FROM departments WHERE location_name = 'TOKYO'
)

これは複数行副問合せ(INを使用)で、TOKYOにある部署IDの一覧を取得し、従業員のdepartment_idがその中にあるかを判定します。
条件2:自部署で最高給与か?

salary = (
  SELECT MAX(salary) FROM employees es 
  WHERE es.department_id = e.department_id
)

こちらは相関副問合せで、外側の従業員eと同じ部署内の最高給与を取得し、その値とe.salaryが一致するかを判定します。
2つの条件をAND結合

  • 条件1で「東京勤務の部署」に絞ります
  • 条件2で「自部署で最高給与の人」に絞ります

結果として「東京の各部署で最も給与が高い従業員」が抽出されます。
ポイント

  • 複数行副問合せ(IN)と相関副問合せ(=)が同じクエリ内に共存する典型的なパターンです
  • 条件1だけだと「東京の全従業員」、条件2だけだと「各部署の最高給与の従業員」になります
  • ANDで組み合わせることで両方の条件を満たす行に絞られます。

前後の問題