MAX / MIN
| 対応: | SQL-92(1992) |
|---|
数値・文字列・日付などの列から最大値と最小値を求める集計関数です。GROUP BYと組み合わせてグループごとの最大・最小を求めることもできます。
構文
列の最大値を取得します。
SELECT MAX(列名) FROM テーブル名;
列の最小値を取得します。
SELECT MIN(列名) FROM テーブル名;
グループごとの最大値・最小値を取得します。
SELECT グループ列, MAX(列名), MIN(列名) FROM テーブル名 GROUP BY グループ列;
構文一覧
| 構文 | 概要 |
|---|---|
| MAX(列名) | 指定した列の最大値を返します。数値・文字列・日付のいずれにも使用できます。NULL値は無視されます。 |
| MIN(列名) | 指定した列の最小値を返します。数値・文字列・日付のいずれにも使用できます。NULL値は無視されます。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
最高給与と最低給与を取得します。
sample_max_min.sql
SELECT MAX(salary) AS 最高給与, MIN(salary) AS 最低給与 FROM employees;
+----------+----------+ | 最高給与 | 最低給与 | +----------+----------+ | 380000 | 250000 | +----------+----------+ 1 row in set
部署ごとの最高給与と最低給与を取得します。
sample_max_min.sql
SELECT department, MAX(salary) AS 最高給与, MIN(salary) AS 最低給与 FROM employees GROUP BY department;
+----------+----------+----------+ | department | 最高給与 | 最低給与 | +----------+----------+----------+ | 呪術高専 | 380000 | 250000 | +----------+----------+----------+ 1 row in set
全体の平均給与を取得します。
sample_max_min.sql
SELECT AVG(salary) AS 平均給与 FROM employees;
+------------+ | 平均給与 | +------------+ | 307500.000 | +------------+ 1 row in set
最高給与と最低給与の差額を取得します。
sample_max_min.sql
SELECT MAX(salary) - MIN(salary) AS 給与差額 FROM employees;
+----------+ | 給与差額 | +----------+ | 130000 | +----------+ 1 row in set
文字列の最大値(辞書順で最後)を取得します。
sample_max_min.sql
SELECT MAX(name) AS 名前の最大値 FROM employees;
+--------------+ | 名前の最大値 | +--------------+ | 虎杖悠仁 | +--------------+ 1 row in set
最高給与の社員名を取得します(サブクエリを使用)。
sample_max_min.sql
SELECT name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
+--------+--------+ | name | salary | +--------+--------+ | 五条悟 | 380000 | +--------+--------+ 1 row in set
データベース別の書き方
この構文は主要なデータベースで共通して使用できます。
SELECT department, MAX(salary) AS 最高給与, MIN(salary) AS 最低給与 FROM employees GROUP BY department;
最大値・最小値を持つ行の他の列も取得する方法はデータベースによって異なります。MySQL・SQLite ではサブクエリを使用します。
-- MySQL / SQLite(サブクエリ) SELECT name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
PostgreSQL ではウィンドウ関数を使う方法もあり、同率1位も取得できます。
-- PostgreSQL(ウィンドウ関数)
SELECT name, salary FROM (
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) ranked WHERE rnk = 1;
概要
『MAX』と『MIN』は数値だけでなく、文字列(辞書順)や日付(時系列)にも適用できます。文字列の場合は文字コード順(UTF-8では五十音順に近い結果)で最大・最小が決まります。
『MAX』・『MIN』はNULL値を無視して計算します。列のすべての値がNULLの場合、結果もNULLになります。
最大値・最小値を持つ行の他の列も取得したい場合は、サブクエリで最大・最小を求めてから『WHERE』で絞り込む方法が一般的です。同じ値を持つ行が複数ある場合は複数行取得されます。合計・平均は『SUM / AVG』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。