グループ処理とグループ関数(続き)
では、もう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は不正解)。
この記事は参考になりましたか?
- めざせオラクルマスターホルダー! Oracle DB 12c SQL基礎 弱点克服スクール連載記事一覧
- この記事の著者
-
林 優子(ハヤシ ユウコ)
日本オラクル株式会社の教育ビジネスのスタートアップを全面的に支援し、バージョン5の頃からOracleに携わるベテラン講師として知る人も多い。Oracle認定講師を表彰するExcellent Instructorを連続受賞。1ランク上のITスペシャリスト育成を目標に、データベース分野にとどまらず「プレゼンテーション」、「ロジカルシンキング」などのトレーニングも手がけている。著書に『オラクルマスター教科書』シリーズ(翔泳社)、『プロとしてのデータモデリング入門』(SBクリエイティブ)など。その他、雑誌執筆、著書・メディア出演も多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

