以下の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で組み合わせることで両方の条件を満たす行に絞られます。