メインコンテンツへ
データベース

各部門の平均給与より高い給与の従業員を取得するSQL文はどれか。(テーブル名: employees, 列名: emp_id, dept_id, salary)

ア.SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
イ.SELECT * FROM employees e1 WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.dept_id = e1.dept_id)正解
ウ.SELECT * FROM employees GROUP BY dept_id HAVING salary > AVG(salary)
エ.SELECT * FROM employees WHERE dept_id IN (SELECT dept_id FROM employees WHERE salary > AVG(salary))

解説

相関副問い合わせは「クラスの平均点と比較する」ような仕組み。外側の各行ごとに内側のSELECTが再計算される。

なぜ イ が正解か

イは相関副問い合わせ。e1の各従業員に対して、同じ部門(e2.dept_id = e1.dept_id)の平均給与を計算し、それより高い給与の従業員を返す。部門ごとの平均との比較になる正しい形。

なぜ ア は間違いか

WHERE salary > (SELECT AVG(salary) FROM employees) は全従業員の平均との比較であり、部門ごとの平均ではない。

なぜ ウ は間違いか

GROUP BY dept_id HAVING salary > AVG(salary) は文法的に誤り。HAVINGでは個々のsalaryと集計関数は直接比較できない。

なぜ エ は間違いか

WHERE dept_id IN (SELECT dept_id FROM employees WHERE salary > AVG(salary)) はサブクエリ内でWHEREとAVGを組み合わせた文法エラー。

出典: AI生成問題(学習用)