Sql-certificate-using-the-group-functions
グループ機能を使用する
グループ機能を使用した集計データのレポート
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句では使用できません。 その違反により、Oracle ORA-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句と組み合わせて使用されます。 GROUP BY句を使用すると、集計関数を使用して、次のようなより複雑な管理上の質問に答えることができます。
各部門の従業員の平均給与はいくらですか?
各部門で何人の従業員が働いていますか?
特定のプロジェクトに何人の従業員が取り組んでいますか?
グループ化機能は、列に基づいてデータグループを確立し、グループ内の情報のみを集約します。 グループ化基準は、GROUP BY句で指定された列によって定義されます。 この階層に従って、データは最初にグループに編成され、次にWHERE句によって各グループの行が制限されます。
GROUP BY句の使用のガイドライン
(1)GROUP BY関数で使用されるすべての依存列または列は、グループ化の基礎を形成する必要があるため、GROUP BY句にも含める必要があります。
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:GROUPではなく」として例外をスローしますBY式」。
(4)集計関数はGROUP BY句では使用できません。 Oracleは、「ORA-00934:グループ関数は許可されていません」というエラーメッセージを返します。
以下のクエリは、各部門で働いている従業員の数をリストしています。
SELECT DEPARTMENT_ID, COUNT (*)
FROM employees
GROUP BY DEPARTMENT_ID;
同様に、以下のクエリは、各部門の各ジョブIDの給与の合計を検索します。 グループは部門とジョブIDに基づいて確立されていることに注意してください。 したがって、GROUP BY句に表示されます。
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、集合関数でのすべてのキーワードの使用
入力パラメーターでDISTINCTキーワードを指定することにより、group by functionは集計の列の一意の値のみを考慮します。 入力パラメーターでALLキーワードを指定することにより、関数ごとのグループ化は、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句の結果に基づいて結果テーブルから行を削除するため、GROUP BY句オプションに直接関連する条件付きオプションです。
SELECT department_id, AVG(Salary)
FROM employees
HAVING AVG(Salary) > 33000;
ERROR at line 1: ORA-00937: not a single-group group function