このセクションでは、値のセットを演算するグループ
( 集約 )
関数について説明します。特別に説明されていない限り、グループ関数は
NULL
値を無視します。
GROUP BY
句を含まないステートメントでグループ関数を使用する場合、すべての行をグループ分けするのと同様の効果になります。
数値引数では、分散値と標準偏差関数が
DOUBLE
値を戻します。SUM()
および
AVG()
関数は、高精度値引数 (
整数または DECIMAL
) に対して
DECIMAL
値を戻し、近似値引数 (
FLOAT
または DOUBLE
)
に対してDOUBLE
値を戻します。
SUM()
および AVG()
集約関数は、一時値とはうまく作動しません。(
値を数字に変換し、最初の非数値文字の後のパートを失います
)
。この問題を回避するには、数値ユニットを変換し、集約演算を行い、一時値に変換しなおすという方法があります。例
:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col
))) FROMtbl_name
; SELECT FROM_DAYS(SUM(TO_DAYS(date_col
))) FROMtbl_name
;
の平均値を戻します。expr
expr
の固有値の平均を戻すのに、DISTINCT
オプションを使用することができます。
一致する行がない場合、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
分によって引き出された行の、非
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
がひとつのテーブルから検索し、他のカラムは引き出されず、また
WHERE
カラムがない場合、きわめて素早く戻すよう最適化されています。例
:
mysql> SELECT COUNT(*) FROM student;
この最適化は、正確な行の数がこの保存エンジンに保管されており、素早いアクセスが可能なため、MyISAM
テーブルにのみ適用します。InnoDB
をはじめとするトランザクション保存エンジンに関しては、正確な行の数を保存するのは、複数のトランザクションが起こって、それぞれが行の係数に影響をおよぼす場合があるため、より困難になります。
COUNT(DISTINCT
expr
,[expr
...])
異なる非 NULL
値の数を戻します。
一致する行がない場合、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
...]] [SEPARATORstr_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
句を使用してください。逆順でソートするには、DESC
( 降順 ) キーワードを、ORDER BY
句のソートするカラムの名前に加えてください。デフォルトでは昇順になっています。これは、ASC
を使うことで明示的に指定することができます。SEPARATOR
の後には、結果の値の間に挿入されるべきストリング値が続きます。デフォルトは
コンマ ( ‘,
’ )
です。SEPARATOR ''
を使用すると、セパレータを一挙に取り除くことができます。
group_concat_max_len
システム環境変数は、許可された最大の長さに設定することができます。
( デフォルト値は 1024 )
。ランタイムでこれを行う構文は次です。val
は符号なしの整数になります :
SET [SESSION | GLOBAL] group_concat_max_len = val
;
最大の長さが設定された場合、結果はその最大の長さに切り詰められます。
GROUP_CONCAT()
によって戻されるタイプは、group_concat_max_len
が 512 より大きい場合意外は常に
VARCHAR
になります。512
を越える場合は BLOB
になります。
CONCAT()
および
CONCAT_WS()
も併せてご覧ください :
項11.3. 「文字列関数」.
MIN([DISTINCT]
,
expr
)MAX([DISTINCT]
expr
)
expr
の最小または最大値を戻します。MIN()
および MAX()
はストリングの引数を取る場合があります。その場合、それらは最小または最大のストリング値を戻します。項6.4.5. 「MySQLにおけるインデックスの使用」
をご覧ください。DISTINCT
キーワードで expr
の固有の値の最小または最大を検出できますが、その場合、DISTINCT
を省略した場合と同じ結果を生成します。
一致する行がない場合、MIN()
および MAX()
は
NULL
を戻します。
mysql>SELECT student_name, MIN(test_score), MAX(test_score)
->FROM student
->GROUP BY student_name;
MIN()
、MAX()
、および他の集約関数に関しては、MySQL
は現在、ENUM
と
SET
カラムを、セット内でのそれらのストリングの相対位置によってではなく、ストリング値によって比較しています。これは、ORDER
BY
がそれらをどう比較するかによって異なります。この点は、将来の
MySQL リリースに反映される予定です。
expr
の母標準偏差を戻します。これは標準 SQL
へのエクステンションです。この関数の
STDDEV()
フォームは、Oracle
との相互性のために提供されています。標準
SQL 関数 STDDEV_POP()
を代わりに使用することも可能です。
これらの関数は、一致する行がない場合は、NULL
を戻します。
expr
の母標準偏差 (
VAR_POP()
の平方根 )
を戻します。STD()
または
STDDEV()
を使用することもできます。これらは同等ですが標準
SQL ではありません。
一致する行がない場合、STDDEV_POP()
は NULL
を戻します。
expr
の試料標準偏差 (
VAR_SAMP()
の平方根 )
を戻します。
一致する行がない場合、STDDEV_SAMP()
は NULL
を戻します。
expr
の集計を戻します。返しセットが行を持たない場合、SUM()
は NULL
を戻します。MySQL
5.1 で DISTINCT
を使用して、expr
の重複しない値のみを集計することができます。
一致する行がない場合、SUM()
は NULL
を戻します。
expr
の母標準分散を戻します。行をサンプルではなく全母集団としてとらえ、行の数を分母として得ます。また、VARIANCE()
を使用することもできます。これは同等ですが標準
SQL ではありません。
一致する行がない場合、VAR_POP()
は NULL
を戻します。
expr
のサンプル分散を戻します。この分母は行の数から
1 をひいたものです。
一致する行がない場合、VAR_SAMP()
は NULL
を戻します。
expr
の母標準分散を戻します。これは標準 SQL
へのエクステンションです。標準 SQL 関数
VAR_POP()
を代わりに使用することも可能です。
一致する行がない場合、VARIANCE()
は NULL
を戻します。