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

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

SELECT employee_id, salary FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);
A全従業員の給与
B平均給与以上の従業員リスト✓
C平均給与以下の従業員リスト
D最低給与の従業員リスト
正解:B解説

副問合せで全従業員の平均給与を算出した上で、それより高い給与を持つ従業員を抽出しています。
処理の流れ

  1. 副問合せ(内側):SELECT AVG(salary) FROM employeesで全従業員の平均給与を取得します
  2. 主問合せ(外側):その平均給与より大きい給与を持つ従業員のemployee_idとsalaryを返します

単一行副問合せの特徴
副問合せが1行1列だけを返すため、比較演算子(=,<,>,<=,>=)で直接比較できます。これを単一行副問合せと呼びます。
もし副問合せが複数行返す場合

-- 部署ごとの平均給与(複数行)と比較するとエラー
WHERE salary > (SELECT AVG(salary) FROM employees GROUP BY department_id)
-- ORA-01427: single-row subquery returns more than one row

複数行を返す場合はIN,ANY,ALLなどの複数行副問合せ演算子を使う必要があります。

前後の問題