表 12.24 集約 (GROUP BY) 関数
名前 | 説明 |
---|---|
AVG() |
引数の平均値を返します |
BIT_AND() |
ビット単位の And を返します |
BIT_OR() |
ビット単位の OR を返します |
BIT_XOR() |
ビット単位の XOR を返します |
COUNT() |
返された行数のカウントを返します |
COUNT(DISTINCT) |
異なる値のカウントを返します |
GROUP_CONCAT() |
連結された文字列を返します |
MAX() |
最大値を返します |
MIN() |
最小値を返します |
STD() |
母標準偏差を返します |
STDDEV() |
母標準偏差を返します |
STDDEV_POP() |
母標準偏差を返します |
STDDEV_SAMP() |
標本標準偏差を返します |
SUM() |
集計を返します |
VAR_POP() |
母標準分散を返します |
VAR_SAMP() |
標本分散を返します |
VARIANCE() |
母標準分散を返します |
このセクションでは、値のセットを演算するグループ
(集約)
関数について説明します。特に指定されていなければ、グループ関数では
NULL
値が無視されます。
GROUP BY
句を含まないステートメントでグループ関数を使用する場合は、すべての行をグループ化することと同等になります。詳細は、セクション12.19.3「MySQL での GROUP BY の処理」を参照してください。
数値の引数の場合、分散および標準偏差関数が
DOUBLE
値を返します。SUM()
および AVG()
関数は、正確な値の引数 (整数または
DECIMAL
) の場合は
DECIMAL
値を返し、近似値の引数
(FLOAT
または
DOUBLE
) の場合は
DOUBLE
値を返します。
SUM()
および
AVG()
集計関数は時間値を扱いません。(これらは値を数字に変換するので、最初の数字以外の文字のあとのすべての情報が失われます。)この問題を回避するには、数値単位に変換し、集計操作を実行してから、時間値に戻します。例:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
数値引数を取る SUM()
や
AVG()
などの関数は、必要に応じて引数を数値にキャストします。SET
や ENUM
値の場合、キャスト演算でベースとなる数値が使用されます。
-
の平均値を返します。expr
DISTINCT
オプションを使用すると、個別のexpr
値の平均を返すことができます。一致する行がなかった場合、
AVG()
はNULL
を返します。mysql> SELECT student_name, AVG(test_score) -> FROM student -> GROUP BY student_name;
-
expr
内のすべてのビットのビット単位のAND
を返します。計算は 64 ビット (BIGINT
) の精度で実行されます。一致する行がなかった場合、この関数は
18446744073709551615
を返します。(これは、すべてのビットが 1 に設定された符号なしBIGINT
値の値です。) -
expr
内のすべてのビットのビット単位のOR
を返します。計算は 64 ビット (BIGINT
) の精度で実行されます。一致する行がなかった場合、この関数は
0
を返します。 -
expr
内のすべてのビットのビット単位のXOR
を返します。計算は 64 ビット (BIGINT
) の精度で実行されます。一致する行がなかった場合、この関数は
0
を返します。 -
SELECT
ステートメントで取得された行に含まれるexpr
の非NULL
値の数を返します。結果はBIGINT
値になります。一致する行がなかった場合、
COUNT()
は0
を返します。mysql> SELECT student.student_name,COUNT(*) -> FROM student,course -> WHERE student.student_id=course.student_id -> GROUP BY student_name;
COUNT(*)
は、NULL
値が含まれるかどうかに関係なく、取得された行の数を返すという点で少し異なります。COUNT(*)
は、SELECT
が 1 つのテーブルから取得し、その他のカラムは取得されず、WHERE
句がない場合に、非常に迅速に返すように最適化されています。例:mysql> SELECT COUNT(*) FROM student;
この最適化は、
MyISAM
テーブルにのみ適用されます。その理由は、正確な行数は、このストレージエンジンで格納されることで、非常にすばやくアクセスできるためです。InnoDB
などのトランザクショナルストレージエンジンで正確な行数を格納すると、複数のトランザクションが発生し、それぞれが数に影響を与える可能性があるため、問題が発生する可能性が高くなります。 -
COUNT(DISTINCT
expr
,[expr
...])さまざまな非
NULL
expr
値を含む行の数を返します。一致する行がなかった場合、
COUNT(DISTINCT)
は0
を返します。mysql> SELECT COUNT(DISTINCT results) FROM student;
MySQL では、式のリストを指定することで、
NULL
が含まれない個別の式の組み合わせ数を取得できます。標準 SQL では、COUNT(DISTINCT ...)
内部で、すべての式の連結を行う必要があります。 -
この関数は、グループから連結された非
NULL
値を含む文字列の結果を返します。非NULL
値がない場合は、NULL
を返します。完全な構文は次のとおりです。GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
mysql> SELECT student_name, -> GROUP_CONCAT(test_score) -> FROM student -> GROUP BY student_name;
または:
mysql> SELECT student_name, -> GROUP_CONCAT(DISTINCT test_score -> ORDER BY test_score DESC SEPARATOR ' ') -> FROM student -> GROUP BY student_name;
MySQL では、式の組み合わせを連結した値を取得できます。重複する値を除去するには、
DISTINCT
句を使用します。結果の値をソートするには、ORDER BY
句を使用します。逆順でソートするには、ORDER BY
句のソートするカラムの名前にDESC
(降順) キーワードを追加します。デフォルトは昇順です。これは、ASC
キーワードを使用することで明示的に指定できます。グループ内の値間のデフォルトの区切り文字は、カンマ (「,
」) です。区切り文字を明示的に指定するには、SEPARATOR
に続けて、グループ値の間に挿入される文字列リテラル値を指定します。区切り文字を完全に除去するには、SEPARATOR ''
を指定します。結果は、
group_concat_max_len
システム変数で指定された最大長まで切り捨てられます。その変数のデフォルト値は 1024 です。さらに高い値にも設定できますが、戻り値の有効な最大長は、max_allowed_packet
の値によって制約されます。実行時にgroup_concat_max_len
の値を変更するための構文は、次のとおりです。ここで、val
は符号なし整数です。SET [GLOBAL | SESSION] group_concat_max_len = val;
戻り値は、引数が非バイナリとバイナリのどちらの文字列であるのかに応じて、非バイナリ文字列またはバイナリ文字列になります。結果の型は、
group_concat_max_len
が 512 以下の場合 (この場合、結果の型はVARCHAR
またはVARBINARY
です) を除いて、TEXT
またはBLOB
です。CONCAT()
およびCONCAT_WS()
: セクション12.5「文字列関数」も参照してください。 -
expr
の最大値を返します。MAX()
には、文字列の引数を指定できます。このような場合は、最大の文字列値が返されます。セクション8.3.1「MySQL のインデックスの使用の仕組み」を参照してください。DISTINCT
キーワードを使用すると、個別のexpr
値の最大を検索できます。ただし、DISTINCT
を省略した場合と同じ結果が生成されます。一致する行がなかった場合、
MAX()
はNULL
を返します。mysql> SELECT student_name, MIN(test_score), MAX(test_score) -> FROM student -> GROUP BY student_name;
現在、MySQL の
MAX()
では、ENUM
とSET
カラムが、セット内の文字列の相対位置ではなく、文字列値について比較されます。これは、ORDER BY
による比較方法とは異なります。これは、今後の MySQL リリースで反映される予定です。 -
expr
の最小値を返します。MIN()
には、文字列の引数を指定できます。このような場合は、最小の文字列値が返されます。セクション8.3.1「MySQL のインデックスの使用の仕組み」を参照してください。DISTINCT
キーワードを使用すると、個別のexpr
値の最小を検索できます。ただし、DISTINCT
を省略した場合と同じ結果が生成されます。一致する行がなかった場合、
MIN()
はNULL
を返します。mysql> SELECT student_name, MIN(test_score), MAX(test_score) -> FROM student -> GROUP BY student_name;
現在、MySQL の
MIN()
では、ENUM
とSET
カラムが、セット内の文字列の相対位置ではなく、文字列値について比較されます。これは、ORDER BY
による比較方法とは異なります。これは、今後の MySQL リリースで反映される予定です。 -
expr
の母標準偏差を返します。これは、標準 SQL の拡張です。代わりに、標準 SQL 関数STDDEV_POP()
を使用できます。一致する行がなかった場合、この関数は
NULL
を返します。 -
expr
の母標準偏差を返します。この関数は、Oracle との互換性を確保するために提供されています。代わりに、標準 SQL 関数STDDEV_POP()
を使用できます。一致する行がなかった場合、この関数は
NULL
を返します。 -
expr
の母標準偏差 (VAR_POP()
の平方根) を返します。STD()
またはSTDDEV()
を使用することもできます。これらは同等ですが、標準 SQL ではありません。一致する行がなかった場合、
STDDEV_POP()
はNULL
を返します。 -
expr
の標本標準偏差 (VAR_SAMP()
の平方根) を返します。一致する行がなかった場合、
STDDEV_SAMP()
はNULL
を返します。 -
expr
の集計を返します。戻り値のセットに行が含まれていない場合、SUM()
はNULL
を返します。DISTINCT
キーワードを使用すると、個別のexpr
値のみを集計できます。一致する行がなかった場合、
SUM()
はNULL
を返します。 -
expr
の母標準分散を返します。行は標本ではなく、母集団全体とみなされるため、行の数が分母とみなされます。また、VARIANCE()
を使用することもできます。これは同等ですが、標準 SQL ではありません。一致する行がなかった場合、
VAR_POP()
はNULL
を返します。 -
expr
の標本分散を返します。つまり、分母は行の数から 1 を引いたものです。一致する行がなかった場合、
VAR_SAMP()
はNULL
を返します。 -
expr
の母標準分散を返します。これは、標準 SQL の拡張です。代わりに、標準 SQL 関数VAR_POP()
を使用できます。一致する行がなかった場合、
VARIANCE()
はNULL
を返します。