グループ機能の使用

グループ機能を使用した集計データのレポート

SQLには、まさにこの種の情報を生成するクエリを作成するために使用できる多数の事前定義された集計関数があります。GROUPBY句は、情報を集計するときにデータテーブルから行をグループ化する方法を指定し、HAVING句はに属していない行を除外します。指定されたグループ。

集計関数は、テーブル内のすべての行のカウント、列のデータの平均化、数値データの合計など、さまざまなアクションを実行します。集計では、テーブルを検索して、列内の最大の「MAX」値または最小の「MIN」値を見つけることもできます。他のタイプのクエリと同様に、WHERE句を使用して、これらの関数が作用する行を制限または除外できます。たとえば、マネージャーが組織で働いている従業員の数を知る必要がある場合、COUNT(*)という名前の集計関数を使用してこの情報を生成できます。以下のSELECTステートメントに示されているCOUNT(*)関数は、テーブル。

SELECT COUNT(*)
FROM employees;

  COUNT(*)
----------
        24

COUNT(*)関数の結果テーブルは、スカラー結果または値と呼ばれる単一行の単一列です。結果テーブルには、SELECT句で指定された集計関数の名前に対応する列見出しがあることに注意してください。

一般的に使用される集計関数の一部は次のとおりです-

SUM( [ALL | DISTINCT] expression )

AVG( [ALL | DISTINCT] expression )

COUNT( [ALL | DISTINCT] expression )

COUNT(*)

MAX(expression)

MIN(expression)

ALLおよびDISTINCTキーワードはオプションであり、記述を学習したSELECT句と同じように実行されます。ALLキーワードは、オプションが許可されているデフォルトです。構文にリストされている式は、定数、関数、または、列名、定数、および算術演算子で接続された関数の任意の組み合わせ。ただし、集計関数は、ほとんどの場合、列名とともに使用されます。COUNT関数を除いて、すべての集計関数はNULL値を考慮しません。

集計を使用するときに理解して従わなければならない2つのルールがあります。

  • 集計関数は、SELECT句とHAVING句の両方で使用できます(HAVING句についてはこの章の後半で説明します)。

  • 集計関数はWHERE句では使用できません。その違反により、OracleORA-00934グループ関数はここでは許可されないというエラーメッセージが生成されます。

イラスト

以下のSELECTクエリは、組織内の従業員の数をカウントします。

SELECT COUNT(*) Count
FROM employees;

COUNT
-----
   24

以下のSELECTクエリは、組織内の従業員の給与の平均を返します。

SELECT AVG(Salary) average_sal
FROM employees;

AVERAGE_SAL
-----------
      15694

以下のSELECTクエリは、組織内の従業員の給与の合計を返します。

SELECT SUM(Salary) total_sal
FROM employees;

TOTAL_SAL
---------
    87472

以下のSELECTクエリは、組織内の従業員の最も古い雇用日と最も新しい雇用日を返します。

SELECT MIN (hire_date) oldest, MAX (hire_date) latest
FROM employees;

OLDEST		LATEST
---------	-----------
16-JAN-83	01-JUL-2012

GROUP BY

集計関数は通常、GROUPBY句と組み合わせて使用​​されます。GROUP BY句を使用すると、集計関数を使用して、次のようなより複雑な管理上の質問に答えることができます。

各部門の従業員の平均給与はいくらですか?

各部門で何人の従業員が働いていますか?

特定のプロジェクトに取り組んでいる従業員は何人ですか?

Group by関数は、列に基づいてデータグループを確立し、グループ内の情報のみを集約します。グループ化基準は、GROUPBY句で指定された列によって定義されます。この階層に従って、データは最初にグループに編成され、次にWHERE句が各グループの行を制限します。

GROUPBY句の使用に関するガイドライン

(1)GROUP BY関数で使用されるすべての従属列または列は、グループ化の基礎を形成する必要があるため、GROUPBY句にも含める必要があります。

SELECT	DEPARTMENT_ID, SUM(SALARY)
FROM employees;

DEPARTMENT_ID,
*
ERROR at line 2:
ORA-00937: not a single-group group function

(2)GROUP BY句は、列エイリアスの使用をサポートしていませんが、実際の名前をサポートしています。

(3)GROUP BY句は、SUM、AVG、COUNT、MAX、MINなどの集計関数でのみ使用できます。単一行関数で使用すると、Oracleは「ORA-00979:GROUPBY式ではありません」として例外をスローします。 。

(4)GROUPBY句で集計関数を使用することはできません。Oracleは、ここに「ORA-00934:グループ関数は許可されていません」というエラーメッセージを返します。

以下のクエリは、各部門で働いている従業員の数を示しています。

SELECT  DEPARTMENT_ID,  COUNT (*)
FROM employees
GROUP BY DEPARTMENT_ID;

同様に、以下のクエリは、各部門のそれぞれのジョブIDの給与の合計を検索します。グループは部門とジョブIDに基づいて確立されていることに注意してください。したがって、それらはGROUPBY句に表示されます。

SELECT DEPARTMENT_ID, JOB_ID, SUM (SAL)
FROM employees
GROUP BY DEPARTMENT_ID, JOB_ID;

以下のクエリでも同じ結果が得られます。グループ化は部門IDとジョブIDの列に基づいていますが、表示目的では使用されないことに注意してください。

SELECT SUM (SALARY)
FROM employees
GROUP BY DEPARTMENT_ID, JOB_ID;

DISTINCTの使用、集計関数を使用したすべてのキーワード

inputパラメーターでDISTINCTキーワードを指定することにより、group by関数は、集計対象の列の一意の値のみを考慮します。inputパラメーターでALLキーワードを指定することにより、group by関数は、NULLおよび重複を含む、集計対象の列のすべての値を考慮します。ALLがデフォルトの仕様です。

HAVING句

HAVING句は、列名と式にWHERE句が使用されるのと同じ方法で集計関数に使用されます。基本的に、HAVING句とWHERE句は同じことを行います。つまり、条件に基づいて結果テーブルに行が含まれないようにフィルタリングします。 。HAVING句はグループを除外しているように見えるかもしれませんが、そうではありません。むしろ、HAVING句は行をフィルタリングします。

グループのすべての行が削除されると、グループも削除されます。要約すると、WHERE句とHAVING句の重要な違いは次のとおりです。

WHERE句は、GROUPINGアクションの前(つまり、集計関数の計算前)に行をフィルタリングするために使用されます。

HAVING句は、GROUPINGアクションの後(つまり、集計関数の計算後)に行をフィルタリングします。

SELECT JOB_ID,	SUM (SALARY)
FROM employees
GROUP BY JOB_ID
HAVING SUM (SALARY) > 10000;

HAVING句は、GROUP BY句の結果に基づいて結果テーブルから行を削除するため、GROUPBY句オプションに直接関連する条件付きオプションです。

SELECT department_id, AVG(Salary)
FROM employees
HAVING AVG(Salary) > 33000;
ERROR at line 1:  ORA-00937: not a single-group group function