現在勉強しているオラクルマスターブロンズ(SQL)についてまとめたものです。
自分のアウトプット用なので見やすさなどは期待しないでください。
グループ関数(複数行関数)
グループ関数は複数件の入力データをグループ化して、集計処理を行った結果を1つだけ戻す関数で、複数行関数や集計関数と呼ばれることもある。
グループ関数の基本構文とタイプ
グループ関数はSELECT句、ORDER BY句、HAVING句で使用でき、WHERE句では使用できない。
また、複数のグループがある場合はグループの数だけ結果を戻す。
引数には、列名または列名を含む式を指定でき、重複した値に対する処理方法を以下のようなオプションとして指定できる。
- DISTINCT:重複した値は1回だけ処理する。
- ALL:重複した値を含む、すべての値を処理する。デフォルト値。
グループ関数
Oracleデータベースには以下のようなグループ関数がある。
COUNT関数は、取り出されたデータの件数を戻す関数で、引数には数値型、文字型、日付型を戻す式または列に加えてアスタリスクを指定できる。
COUNT関数の引数
- *:重複した値やNULL値も含む、すべてのデータの件数。
- 式またはALL 式:重複した値をそれぞれ1件としてカウントしたデータの件数(NULL値は含まれない)。
- DISTINCT 式:重複した値を1回だけカウントしたデータの件数(NULL値は含まれない)。
MAX関数は最大値を、MIN関数は最小値を戻す関数で、引数には数値型、文字型、日付型を戻す式または列を指定できる。
AVG関数は平均値を、SUM関数は合計値を戻す関数で、引数には数値型を戻す式または列のみ指定できる。
Oracleデータベースには、上記のグループ関数の他に、標準偏差を求めるSTDDEV関数、分数を求めるVARIANCE関数、各グループ内でデータを順序付けて、区切り文字を指定し、連結した結果を戻すLISTAGG関数などもある。
グループ関数では、COUNT関数の引数にアスタリスクを指定した場合を除き、NULL値を無視して集計処理を行う。
データのグループ化と取り出すグループの制限
GROUP BY句によるデータのグループ化
SELECT文にGROUP BY句を指定すると、行をグループ化することができる。
なお、GROUP BY句は、必ずWHERE句の後ろ、かつORDER BY句の前に指定するほか、以下の要件も満たす必要がある。
- GROUP BY句には1つ以上の列を指定する必要がある。
- 列別名は指定できない。
- SELECT句の選択リストにはGROUP BY句で指定した列とグループ関数のみ指定できる(選択しなくてもエラーにはならない)。
- ORDER BY句とGROUP BY句を併用する場合、ORDER BY句にはGROUP BY句で指定した列とグループ関数のみ指定できる。
SELECT文にGROUP BY句の指定がある場合は、グループ関数は2レベルまでネストすることができる。
なお、グループ関数は3レベル以上ネストするとエラーになる。
HAVING句による取り出すグループの制限
グループ関数を条件に指定したい場合は、HAVING句を使用する。
なお、HAVING句も必ずWHERE句の後ろ、かつORDER BY句の前に指定する。
この時、GROUP BY句とHAVING句は順序不同。
HAVING句を使用すると、以下の手順で取り出すグループが制限される。
- WHERE句がある場合、条件によってグループ化する対象の行が制限される。
- GROUP BY句によって行がグループ化される。
- グループ関数が適用される。
- HAVING句によって指定された条件を満たすグループが取り出される。
なお、GROUP BY句を指定せずに、HAVING句のみを指定した場合は、選択された行全体が1つのグループとして処理される。
通常、グループ関数を使用しない条件はWHERE句に指定するが、GROUP BY句に指定されている列を使用した条件に限り、HAVING句に指定してもエラーにならない。