Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


12.19.1 GROUP BY (集約) 関数

表 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() などの関数は、必要に応じて引数を数値にキャストします。SETENUM 値の場合、キャスト演算でベースとなる数値が使用されます。

  • AVG([DISTINCT] expr)

    expr の平均値を返します。DISTINCT オプションを使用すると、個別の expr 値の平均を返すことができます。

    一致する行がなかった場合、AVG()NULL を返します。

    mysql> SELECT student_name, AVG(test_score)
        ->        FROM student
        ->        GROUP BY student_name;
  • BIT_AND(expr)

    expr 内のすべてのビットのビット単位の AND を返します。計算は 64 ビット (BIGINT) の精度で実行されます。

    一致する行がなかった場合、この関数は 18446744073709551615 を返します。(これは、すべてのビットが 1 に設定された符号なし BIGINT 値の値です。)

  • BIT_OR(expr)

    expr 内のすべてのビットのビット単位の OR を返します。計算は 64 ビット (BIGINT) の精度で実行されます。

    一致する行がなかった場合、この関数は 0 を返します。

  • BIT_XOR(expr)

    expr 内のすべてのビットのビット単位の XOR を返します。計算は 64 ビット (BIGINT) の精度で実行されます。

    一致する行がなかった場合、この関数は 0 を返します。

  • COUNT(expr)

    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 ...) 内部で、すべての式の連結を行う必要があります。

  • GROUP_CONCAT(expr)

    この関数は、グループから連結された非 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「文字列関数」も参照してください。

  • MAX([DISTINCT] expr)

    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() では、ENUMSET カラムが、セット内の文字列の相対位置ではなく、文字列値について比較されます。これは、ORDER BY による比較方法とは異なります。これは、今後の MySQL リリースで反映される予定です。

  • MIN([DISTINCT] expr)

    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() では、ENUMSET カラムが、セット内の文字列の相対位置ではなく、文字列値について比較されます。これは、ORDER BY による比較方法とは異なります。これは、今後の MySQL リリースで反映される予定です。

  • STD(expr)

    expr の母標準偏差を返します。これは、標準 SQL の拡張です。代わりに、標準 SQL 関数 STDDEV_POP() を使用できます。

    一致する行がなかった場合、この関数は NULL を返します。

  • STDDEV(expr)

    expr の母標準偏差を返します。この関数は、Oracle との互換性を確保するために提供されています。代わりに、標準 SQL 関数 STDDEV_POP() を使用できます。

    一致する行がなかった場合、この関数は NULL を返します。

  • STDDEV_POP(expr)

    expr の母標準偏差 (VAR_POP() の平方根) を返します。STD() または STDDEV() を使用することもできます。これらは同等ですが、標準 SQL ではありません。

    一致する行がなかった場合、STDDEV_POP()NULL を返します。

  • STDDEV_SAMP(expr)

    expr の標本標準偏差 (VAR_SAMP() の平方根) を返します。

    一致する行がなかった場合、STDDEV_SAMP()NULL を返します。

  • SUM([DISTINCT] expr)

    expr の集計を返します。戻り値のセットに行が含まれていない場合、SUM()NULL を返します。DISTINCT キーワードを使用すると、個別の expr 値のみを集計できます。

    一致する行がなかった場合、SUM()NULL を返します。

  • VAR_POP(expr)

    expr の母標準分散を返します。行は標本ではなく、母集団全体とみなされるため、行の数が分母とみなされます。また、VARIANCE() を使用することもできます。これは同等ですが、標準 SQL ではありません。

    一致する行がなかった場合、VAR_POP()NULL を返します。

  • VAR_SAMP(expr)

    expr の標本分散を返します。つまり、分母は行の数から 1 を引いたものです。

    一致する行がなかった場合、VAR_SAMP()NULL を返します。

  • VARIANCE(expr)

    expr の母標準分散を返します。これは、標準 SQL の拡張です。代わりに、標準 SQL 関数 VAR_POP() を使用できます。

    一致する行がなかった場合、VARIANCE()NULL を返します。