連載
» 2008年07月11日 00時00分 公開

グループ関数を使用したデータの集計間違いやすいポイントを追え! Bronze SQL基礎I(5)(2/2 ページ)

[ゴールデンフォレスト株式会社,@IT]
前のページへ 1|2       

GROUP BY句とHAVING句の使用方法

例題2

SQL文中に記述する句の順番について、正しいものを選択してください。

a.SELECT
FROM
WHERE
HAVING
GROUP BY
ORDER BY

b.SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

c.HAVING句とGROUP BY句は同時には使えない

d.SELECT
FROM
WHERE
ORDER BY
GROUP BY
HAVING

例題の範囲をおさらい

参考:「SQLの関数でデータを集計する

 SELECT文の中に記述する句はたくさんありますが、記述の順番を間違えるとエラーになりますので注意しましょう。

正解

b

解説

 SELECT文の正しい記述方法は以下です。

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

 よって、正解はbです。

 選択肢cにHAVING句とGROUP BY句は同時には使用できないとありますが、実際には使用が可能です。

(例)
SQL> select avg(salary)
  2  from employees
  3  where department_id in (10,20,30)
  4  group by department_id
  5  having avg(salary)>=3000
  6  order by avg(salary);
AVG(SALARY)
-----------
       4400
       9500

例題3

次のSQL文を確認してください。

select avg(salary)
from employees
where avg(salary)>=4000
group by department_id;

上記を実行した結果として、正しいものを1つ選択してください。

a.GROUP BY句とWHERE句の順番が逆であるため、エラーになる

b.値が1行のみ戻ってくる

c.値が複数行戻ってくる

d.グループの制限をWHERE句で行っているため、エラーになる

例題の範囲をおさらい

参考:「SQLの関数でデータを集計する

 グループ関数を使用した式で制限を行う場合、HAVING句を使用する必要があります。

正解

d

解説

 問題文のSQLを実行すると、以下のような結果が戻ります。

SQL> select avg(salary)
2  from employees
3  where avg(salary)>=4000
4  group by department_id;
where avg(salary)>=4000
*
行3でエラーが発生しました。:
ORA-00934:ここではグループ関数は使用できません。

 このように、グループ関数を使用した式で制限を行う場合、WHERE句を使うとエラーになります。WHERE句をHAVING句に置き換えると、以下のような結果が戻ります。

SQL> select avg(salary)
  2  from employees
  3  having avg(salary)>=4000
  4  group by department_id;
AVG(SALARY)
-----------
       7000
       9500
 19333.3333
      10150
 10033.3333
       4400
       6400
7行が選択されました。

 よって、正しいものはdです。

まとめ

 次の内容をチェックしましょう。

  • グループ関数の特徴
  • GROUP BY句とHAVING句の意味と記述方法

 今回の範囲は、完全に理解しておかないと引っ掛け問題に惑わされやすいところです。実機で確認をしながら、完全に覚えるようにしましょう。

 次回は、複数の表からデータを表示する方法について、間違いやすい点にポイントを絞って説明をします。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。