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

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

Oracleデータベースエンジニアとしての基礎力を証明するORACLE MASTER Bronzeの取得を目指すITエンジニアは多い。本連載で間違いやすいポイントを確認し、合格に近づこう!

[ゴールデンフォレスト株式会社,@IT]

 前回「単一行関数を使用した出力のカスタマイズ」では、単一行関数の種類と特徴、変換関数の使用方法について学習しました。

 今回は、以下の項目について確認します。

  • グループ関数
  • GROUP BY句
  • HAVING句

グループ関数の特徴

例題1

次のデータと要件を確認してください。

SQL> select last_name,salary,commission_pct
  2  from employees;
LAST_NAME                SALARY COMMISSION_PCT
-------------------- ---------- --------------
Whalen                     4400
Hartstein                 13000
Fay                        6000
Higgins                   12000
Gietz                      8300
King                      24000
Kochhar                   17000
De Haan                   17000
Hunold                     9000
Ernst                      6000
Lorentz                    4200
LAST_NAME                SALARY COMMISSION_PCT
-------------------- ---------- --------------
Mourgos                    5800
Rajs                       3500
Davies                     3100
Matos                      2600
Vargas                     2500
Zlotkey                   10500             .2
Abel                      11000             .3
Taylor                     8600             .2
Grant                      7000            .15
20行が選択されました。

次の文のうち、実行するとエラーになるものを選択してください。

a.select last_name,avg(salary) from employees;

b.select count(last_name),avg(salary) from employees;

c.select avg(last_name),avg(salary) from employees;

d.select count(*),count(commission_pct) from employees;

例題の範囲をおさらい

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

 AVG、COUNTなどのグループ関数は、複数の値を受け取って1つの値を戻します。AVGでは、指定された列の複数の値の平均値が求められます。COUNTでは、指定された列の行数が求められます。

(例)
SQL> select avg(salary) from employees;
AVG(SALARY)
-----------
       8775

正解

a、c

解説

選択肢a:このSQLを実行すると、以下のような結果になります。

SQL> select last_name,avg(salary) from employees;
select last_name,avg(salary) from employees
*
行1でエラーが発生しました。:
ORA-00937:単一グループのグループ関数ではありません。

 avg(salary)は1行を戻そうとしますが、LAST_NAMEは複数行を戻そうとします。異なる行数を戻そうとするため、エラーとなります。

選択肢b:このSQLを実行すると、以下のような結果になります。

SQL> select count(last_name),avg(salary) from employees;
COUNT(LAST_NAME) AVG(SALARY)
---------------- -----------
              20        8775

 COUNT、AVGはともにグループ関数であり、count(last_name)、avg(salary)はそれぞれ1行のデータを戻しますので、エラーにはなりません。

選択肢c:このSQLを実行すると、以下のような結果になります。

SQL> select avg(last_name),avg(salary) from employees;
select avg(last_name),avg(salary) from employees
*
行1でエラーが発生しました。:
ORA-01722:数値が無効です。

 avg(last_name)に注意してください。

 AVGは平均値を戻すグループ関数です。よってAVGに指定できる列の値は「数値」でなければなりません。LAST_NAME列には文字が入っているため、エラーとなります。

選択肢d:このSQLを実行すると、以下のような結果になります。

SQL> select count(*),count(commission_pct) from employees;
  COUNT(*) COUNT(COMMISSION_PCT)
---------- ---------------------
        20                     4

 エラーにはならず、SQLは正常に終了します。

 ここで、count(*)とcount(commission_pct)の違いについてもおさらいしておきましょう。

 COUNT(*)は、NULL値を含めたすべての行数を戻します。COUNT(列名)は、NULL値を除いた行数を戻します。

 このSQLの結果は、全体の行数は20行、そのうちCOMMISSION_PCT列に値が入っているのは4行ということを表しています。

 よって、実行するとエラーになるSQL文はa、cです。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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