【MySQL】集計関数

ここではMySQLで使える集計関数をまとめて紹介しています。

GROUP BYを使い方については↓で紹介していますので参考にしてください。
>>【MySQL】データのグループ化と合計・件数の取得

AVG関数

AVG関数を使うことで、列の値の平均値を取得することが出来ます。

AVG関数の基本的な使い方は次の通りです。

・DISTINCT/ALL
 DISTINCTを指定すると重複値を除いた平均値を求めます。ALLを指定すると全ての値の平均値を求めます。デフォルト値はALLです。

AVG([DISTINCT | ALL]式)

次のようなレコードが登録されているテーブルを例として平均値を求めるSQLサンプルを紹介します。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.06 sec)

レコード全体の平均値を取得する方法

レコード全体の中から平均値を求める場合は、GROUPBY句を指定せずに、SELECT句に「MIN(列名)」と記述します。

これでレコード全件の中から平均値を取得することが出来ます。

mysql> SELECT AVG(age) FROM tab1;
+----------+
| AVG(age) |
+----------+
|  37.1667 |
+----------+
1 row in set (0.01 sec)

グループごとの平均値を取得させる方法

GROUPBY句を指定しレコードを集約することで、グループごとの平均値を求めることが出来ます。

次のSQLでは、dept列ごとに平均値を取得しています。

mysql> SELECT dept,AVG(age) FROM tab1 GROUP BY dept;
+-------+----------+
| dept  | AVG(age) |
+-------+----------+
| DEV   |  45.0000 |
| HR    |  28.0000 |
| SALES |  30.0000 |
+-------+----------+
3 rows in set (0.00 sec)

さらにHAVING句やORDER BY句と組み合わせることで、取得するレコードを選択することやレコードの並び替えをすることが出来ます。

mysql> SELECT dept,AVG(age) FROM tab1 GROUP BY dept HAVING AVG(age) >= 30;
+-------+----------+
| dept  | AVG(age) |
+-------+----------+
| DEV   |  45.0000 |
| SALES |  30.0000 |
+-------+----------+
2 rows in set (0.00 sec)

mysql> SELECT dept,AVG(age) FROM tab1 GROUP BY dept ORDER BY AVG(age);
+-------+----------+
| dept  | AVG(age) |
+-------+----------+
| HR    |  28.0000 |
| SALES |  30.0000 |
| DEV   |  45.0000 |
+-------+----------+
3 rows in set (0.00 sec)

COUNT関数

COUNT関数では、行数をカウントしたい式または列名を指定します。

COUNT([DISTINCT | ALL] 式)

・DISTINCT/ALL
 DISTINCTを指定すると重複値を除いた行数を求めます。ALLを指定すると全ての行数を求めます。デフォルト値はALLです。

MAX関数

MAX関数を使うことで、列の値の最大値を取得することが出来ます。

MAX関数では数値、文字列、日付型を指定することが出来ます。

MAX(式) 

次のようなレコードが登録されているテーブルを例として最大値を求めるSQLサンプルを紹介します。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.06 sec)

レコード全体の最大値を取得する方法

レコード全体の中から最大値を求める場合は、GROUPBY句を指定せずに、SELECT句に「MAX(列名)」と記述します。

これでレコード全件の中から最大値を取得することが出来ます。

mysql> SELECT MAX(age) FROM tab1;
+----------+
| MAX(age) |
+----------+
|       55 |
+----------+
1 row in set (0.01 sec)

グループごとの最大値を取得させる方法

GROUPBY句を指定しレコードを集約することで、グループごとの最大値を求めることが出来ます。

次のSQLでは、dept列ごとに最大値を取得しています。

mysql> SELECT dept,MAX(age) FROM tab1 GROUP BY dept;
+-------+----------+
| dept  | MAX(age) |
+-------+----------+
| DEV   |       55 |
| HR    |       28 |
| SALES |       35 |
+-------+----------+
3 rows in set (0.01 sec)

さらにHAVING句やORDER BY句と組み合わせることで、取得するレコードを選択することやレコードの並び替えをすることが出来ます。

mysql> SELECT dept,MAX(age) FROM tab1 GROUP BY dept HAVING MAX(age) >= 30;
+-------+----------+
| dept  | MAX(age) |
+-------+----------+
| DEV   |       55 |
| SALES |       35 |
+-------+----------+
2 rows in set (0.01 sec)

mysql> SELECT dept,MAX(age) FROM tab1 GROUP BY dept ORDER BY MAX(age);
+-------+----------+
| dept  | MAX(age) |
+-------+----------+
| HR    |       28 |
| SALES |       35 |
| DEV   |       55 |
+-------+----------+
3 rows in set (0.00 sec)

MIN関数

MIN関数を使うことで、列の値の最小値を取得することが出来ます。

MIN関数の基本的な使い方は次の通りです。

MIN(列名)

次のようなレコードが登録されているテーブルを例として最小値を求めるSQLサンプルを紹介します。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.06 sec)

レコード全体の最小値を取得する方法

レコード全体の中から最小値を求める場合は、GROUPBY句を指定せずに、SELECT句に「MIN(列名)」と記述します。

これでレコード全件の中から最小値を取得することが出来ます。

mysql> SELECT MIN(age) FROM tab1;
+----------+
| MIN(age) |
+----------+
|       25 |
+----------+
1 row in set (0.07 sec)

グループごとの最小値を取得させる方法

GROUPBY句を指定しレコードを集約することで、グループごとの最小値を求めることが出来ます。

次のSQLでは、dept列ごとに最小値を取得しています。

mysql> SELECT dept,MIN(age) FROM tab1 GROUP BY dept;
+-------+----------+
| dept  | MIN(age) |
+-------+----------+
| DEV   |       35 |
| HR    |       28 |
| SALES |       25 |
+-------+----------+
3 rows in set (0.01 sec)

さらにHAVING句やORDER BY句と組み合わせることで、取得するレコードを選択することやレコードの並び替えをすることが出来ます。

mysql> SELECT dept,MIN(age) FROM tab1 GROUP BY dept HAVING MIN(age) >= 28;
+------+----------+
| dept | MIN(age) |
+------+----------+
| DEV  |       35 |
| HR   |       28 |
+------+----------+
2 rows in set (0.00 sec)

mysql> SELECT dept,MIN(age) FROM tab1 GROUP BY dept ORDER BY MIN(age);
+-------+----------+
| dept  | MIN(age) |
+-------+----------+
| SALES |       25 |
| HR    |       28 |
| DEV   |       35 |
+-------+----------+
3 rows in set (0.00 sec)

SUM関数

SUM関数を使うことで、列の値の合計値を取得することが出来ます。

SUM関数の基本的な使い方は次の通りです。
・DISTINCT/ALL
 DISTINCTを指定すると重複値を除いた合計値を求めます。ALLを指定すると全ての値の合計値を求めます。デフォルト値はALLです。

SUM([DISTINCT | ALL]式)

次のようなレコードが登録されているテーブルを例として合計値を求めるSQLサンプルを紹介します。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.06 sec)

レコード全体の合計値を取得する方法

レコード全体の合計値を求める場合は、GROUPBY句を指定せずに、SELECT句に「SUM(列名)」と記述します。

これでレコード全件の合計値を取得することが出来ます。

mysql> SELECT SUM(age) FROM tab1;
+----------+
| SUM(age) |
+----------+
|      223 |
+----------+
1 row in set (0.00 sec)

グループごとの合計値を取得させる方法

GROUPBY句を指定しレコードを集約することで、グループごとの合計値を求めることが出来ます。

次のSQLでは、dept列ごとに合計値を取得しています。

mysql> SELECT dept,SUM(age) FROM tab1 GROUP BY dept;
+-------+----------+
| dept  | SUM(age) |
+-------+----------+
| DEV   |      135 |
| HR    |       28 |
| SALES |       60 |
+-------+----------+
3 rows in set (0.00 sec)

さらにHAVING句やORDER BY句と組み合わせることで、取得するレコードを選択することやレコードの並び替えをすることが出来ます。

mysql> SELECT dept,SUM(age) FROM tab1 GROUP BY dept HAVING SUM(age) > 30;
+-------+----------+
| dept  | SUM(age) |
+-------+----------+
| DEV   |      135 |
| SALES |       60 |
+-------+----------+
2 rows in set (0.00 sec)

mysql> SELECT dept,SUM(age) FROM tab1 GROUP BY dept ORDER BY SUM(age);
+-------+----------+
| dept  | SUM(age) |
+-------+----------+
| HR    |       28 |
| SALES |       60 |
| DEV   |      135 |
+-------+----------+
3 rows in set (0.00 sec)

前の記事

【MySQL】算術関数

次の記事

MySQL関数