グループ処理とグループ関数(続き)
では、もう1問。
問2
次のSQL文を確認してください。
SELECT job_id,COUNT(last_name) FROM employees WHERE salary > 1000 HAVING AVG(salary) BETWEEN 5000 AND 6000 GROUP BY job_id ORDER BY job_id DESC, COUNT(last_name);
- a. 1つのSELECT文の中で、WHERE句とHAVING句を同時に使用することはできない
- b. 1つのSELECT文の中で、ORDER BY句とGROUP BY句を同時に使用することはできない
- c. HAVING句では、BETWEEN演算子を使用することはできない
- d. ORDER BY句では、グループ関数を使用することはできない
- e. 正常に実行される
実際に実行してみましょう。
SQL> SELECT job_id,COUNT(last_name) 2 FROM employees 3 WHERE salary > 1000 4 HAVING AVG(salary) BETWEEN 5000 AND 6000 5 GROUP BY job_id 6 ORDER BY COUNT(last_name); JOB_ID COUNT(LAST_NAME) ---------- ---------------- MK_REP 1 IT_PROG 5
正解は選択肢eです。
グループ関数に対する条件付けはHAVING
句でしか行えませんが、列や式に対する条件付けはWHERE
句、HAVING
句のどちらでも行うことができ、1つのSELECT
文の中で同時に使用することができます(選択肢aは不正解)。WHERE
句、HAVING
句とも使用できる比較演算子に制限はありません(選択肢cは不正解)。WHERE
句はグループに分割する前に条件に合わない行を除外し、HAVING
句はグループに分割した後に条件に合わない行を除外します。したがって、そもそもグループ処理の対象から外しておきたい行は、WHERE
句で除外すべきです。
GROUP BY
句はグループ分割する単位となる列を指定し、ORDER BY
句は出力順(行の並び順)を指定するものです。グループ処理した結果に基づいて出力順を指定したい場合だってありますから、グループ関数を使用することができます(選択肢dは不正解)。それぞれ使用する目的が異なるので、1つのSELECT
文の中で同時に使用できます(選択肢bは不正解)。