【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)