Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

MAX / MIN

数値・文字列・日付などの列から最大値と最小値を求める集計関数です。GROUP BYと組み合わせてグループごとの最大・最小を求めることもできます。

構文
-- 列の最大値を取得します。
SELECT MAX(列名) FROM テーブル名;

-- 列の最小値を取得します。
SELECT MIN(列名) FROM テーブル名;

-- グループごとの最大値・最小値を取得します。
SELECT グループ列, MAX(列名), MIN(列名) FROM テーブル名 GROUP BY グループ列;
構文一覧
構文概要
MAX(列名)指定した列の最大値を返します。数値・文字列・日付のいずれにも使用できます。NULL値は無視されます。
MIN(列名)指定した列の最小値を返します。数値・文字列・日付のいずれにも使用できます。NULL値は無視されます。
サンプルコード
-- 最高給与と最低給与を取得します。
SELECT MAX(salary) AS 最高給与, MIN(salary) AS 最低給与 FROM employees;

-- 部署ごとの最高給与と最低給与を取得します。
SELECT department, MAX(salary) AS 最高給与, MIN(salary) AS 最低給与
FROM employees
GROUP BY department;

-- 最新の入社日(最も新しい日付)を取得します。
SELECT MAX(hire_date) AS 最新入社日 FROM employees;

-- 最も高価な商品と最も安い商品の価格を取得します。
SELECT MAX(price) AS 最高価格, MIN(price) AS 最低価格 FROM products;

-- 文字列の最大値(辞書順で最後)を取得します。
SELECT MAX(name) AS 名前の最大値 FROM employees;

-- 最高給与の社員名を取得します(サブクエリを使用)。
SELECT name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
実行結果
-- SELECT department, MAX(salary) AS 最高給与, MIN(salary) AS 最低給与
-- FROM employees GROUP BY department; の結果例
-- +----------+----------+----------+
-- | department | 最高給与  | 最低給与  |
-- +----------+----------+----------+
-- | 開発部   |   380000 |   260000 |
-- | 営業部   |   340000 |   250000 |
-- | 総務部   |   320000 |   280000 |
-- +----------+----------+----------+
データベース別の書き方

この構文は主要なデータベースで共通して使用できます。

SELECT department, MAX(salary) AS 最高給与, MIN(salary) AS 最低給与
FROM employees
GROUP BY department;

最大値・最小値を持つ行の他の列も取得する方法はデータベースによって異なります。MySQL・SQLite ではサブクエリを使用しますが、PostgreSQL・Oracle・SQL Server では『FETCH FIRST』やウィンドウ関数が利用できます。

-- 全データベース共通(サブクエリ)
SELECT name, salary FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

-- PostgreSQL・Oracle(12c以降)・SQL Server(2012以降)
-- ウィンドウ関数を使う方法(同率1位も取得可)
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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。