oracle学習ログ03

3998 ワード

集計関数
パケット関数、集約関数とも呼ばれる.集計関数は、行セットを操作し、各グループに結果を与えることができます.
集計関数は、任意の有効な式を使用できます.
NULL
値は集計関数で無視されます
集計関数で使用可能
DISTINCT
キーワード、重複除外
集約関数は次のように分類されます.
AVG(x)
:戻る
x
の平均値
COUNT(x)
:統計を返すローの数
MAX(x)
:戻る
x
の最大値
MIN(x)
:戻る
x
の最小値
SUM(x)
:戻る
x
の合計値
以下は常用しない
MEDIAN(x)
:中間値を返します
stdDEV(x)
:標準偏差を返す
VARIANCE(x)
:戻る
x
の分散
■avg()
AVG(x)
取得
x
の平均値
たとえば、統計
EMP
従業員の平均賃金
SELECTAVG(sal)  FROM EMP;
たとえば、従業員1人当たりの給与を加算できます.
200
式の平均値を求める
     SELECT AVG(sal +200) FROM EMP;
■count()
COUNT(x)
統計クエリが返すローの数
たとえば、統計
EMP
テーブルの行数
SELECTCOUNT(*) FROM EMP;
統計の使用を避ける
COUNT(*)
を選択しないと、より長い統計時間を使用して統計結果が返されます.
カラムのカラム名または
ROWID
星の代わりに
(*)
たとえば、
ROWID
統計をとる
products
テーブルの行数
SELECTCOUNT(empno)FROM EMP;
SELECTCOUNT(rowid)FROM EMP;
■max()、min()
MAX(x)、MIN(x)
個別統計
x
の最大値と最小値
たとえば、統計
EMP

sal
列の最大値と最小値
SELECT MAX(sal),MIN(sal) FROM  EMP;
MAX()
および
MIN()
を選択します.
文字列を統計する場合は、アルファベットがソートされ、最大値は最後の下部、最小値は前の最初の値になります.たとえば、
Albert
になる
Zeb
前面
日付の場合、最大値は最も近い時間、最小値は最も早い時間になります
たとえば、文字列と日付列の最大値と最小値をそれぞれ統計します.
SELECT MAX(ename),MIN(ename) FROM EMP;
SELECT MAX(hiredate),MIN(hiredate) FROM EMP;
■sum()
SUM(x)
すべてを返す
x
の値の合計
たとえば、統計
EMP
表全給与の合計
SELECTSUM(sal)FROM EMP;
■グループ分け
テーブル内のローをグループ化し、各グループの情報を統計する必要がある場合があります.
例:統計
EMP
表の部門で使用可能
GROUP BY
グループ化
SELECTdeptno FROMEMP GROUP BY deptno;
使用可能
GROUPBY
複数の列をグループ化
例:
EMP
表の職階と部門をグループ化
  SELECTdeptno,job FROMEMP GROUP BY deptno,job;
グループ化された行の集計関数の使用
グループ化された行に集計関数を使用すると、集計関数は各グループの値を統計し、各グループについて統計した値を返します.
たとえば
:
部門番号によってグループを分けて、各部門の人数を求めて、平均の給料
Selectdeptno,avg(sal),count(empno)from EMP
Groupby deptno;
たとえば、職階別にグループ化して、各職階の最高賃金と最低賃金を求めます.
Selectjob ,max(sal),min(sal)from EMP group by job
order by job;
集計関数を使用してソートできる複数の統計結果
注意事項
クエリに集計関数が使用されている場合、クエリされたカラムが集計関数で処理されていない場合、これらのカラムは
GROUPBY
句の後
そうでなければ、ヒントが表示されます.
ORA-00937
エラー
,
たとえば
  select deptno,avg(sal) from EMP;
集計関数は使用できません
WHERE
句のフィルタ条件
そうでなければ、ヒントが表示されます.
ORA-00934
エラー
,
たとえば
select
deptno
from EMP where
avg
(
sal
)>1000;
グループ化された行をHAVINGでフィルタする
使用可能
HAVING
句はグループ化された行をフィルタします.
構文:
SELECT...FROM …WHERE
GROUPBY ...
HAVING ...
ORDERBY ...;
に注意
GROUP BY
使用時に使用しなくてもよい
HAVING
を使用します.
HAVING
ある必要があります
GROUP BY
たとえば、
EMP
テーブル内
,
部門の平均賃金が超過する
900
の部門は、まず
GROUPBY
部門をグループ化する
,
次に、各部門の平均賃金を統計してからフィルタリングします.
SELECTdeptno, AVG(sal) FROM EMP
GROUPBY deptno HAVING AVG(sal) > 900;
/*                  */
select * from emp;
select max(e.sal) as"    ", min(e.sal) as"    ",avg(e.sal),sum(e.sal),count(*) from emp e;   
/*             ,    */
select em.ename, em.job, em.sal
  from emp em
 where em.sal = (select max(e.sal) from emp e);
  select em.ename, em.job, max(em.sal)
    from emp em
   group by em.ename, em.job
  having max(em.sal) = (select max(e.sal) from emp e);
  
/*                */
select e.* from emp e where e.sal>(select avg(em.sal) from emp em);

/*                    */
select em.empno,
       em.ename,
       em.job,
       em.mgr,
       em.hiredate,
       em.sal,
       em.deptno,
       emp1.avgsal
  from emp em,
       (select avg(e.sal) as avgsal, e.deptno as deptno
          from emp e
         group by e.deptno) emp1
 where em.deptno = emp1.deptno
   and em.sal > emp1.avgsal