カラムの中から最大の値もしくは最小の値を取得したい場合はMAX関数・MIN関数を使います。
本記事では、MAX関数・MIN関数の基本的な使い方を解説した上で、WHERE句やGROUP BY句、サブクエリとの併用方法まで具体的に説明します。
目次
MAX関数とMIN関数の使い方
MAX関数は指定したカラムの最大値を取得し、MIN関数は最小値を取得します。
それぞれの基本構文は下記になります。
MAX関数の基本構文
SELECT MAX(カラム名)
FROM テーブル名;MAX(カラム名)とすることで、カラムの最大値を取得できます。
MIN関数の基本構文
SELECT MIN(カラム名)
FROM テーブル名;MIN(カラム名)とすることで、カラムの最小値を取得できます。
サンプルデータ
下記のとおり、usersテーブルを用意します。
| id | name | age | address | 
|---|---|---|---|
| 1 | 山田 | 25 | 東京都 | 
| 2 | 鈴木 | 34 | 神奈川県 | 
| 3 | 佐藤 | 29 | 大阪府 | 
| 4 | 佐々木 | 46 | 東京都 | 
| 5 | 大野 | 37 | 大阪府 | 
指定カラムの最大値・最小値を取得する
指定カラムの最大値と最小値を取得する具体的な例を見ていきます。
検索クエリ
usersテーブルから最年長と最年少を取得する
SELECT MIN(age), MAX(age)
FROM users;MIN関数とMAX関数でそれぞれageを指定しています。複数カラムを指定する場合はカンマで区切ります。
実行結果
| MIN(age) | MAX(age) | 
|---|---|
| 25 | 46 | 
ageカラムの最大値と最小値を取得できました。
カラムにNULLが含まれる場合
カラムの値にNULLが含まれる場合に、MIIN関数・MAX関数がどのような動きをするか解説します。
指定したカラムの一部の値がNULLの場合
まず、指定したカラムの一部にNULLが含まれている場合はNULLは無視されます。
例えば、ageカラムを指定して値が24、NULL、39の3つがあるとします。この場合、最大値は39となり、最小値は24となります。
指定したカラムの全ての値がNULLの場合
一方で、指定したカラムの値全てにNULLが含まれている場合は実行結果もNULLになります。
NULLについては下記の記事でまとめています。
 【SQL】IS NULL演算子の使い方を解説!ややこしいNULLの概念を理解しよう
  【SQL】IS NULL演算子の使い方を解説!ややこしいNULLの概念を理解しよう
条件を指定して最大値・最小値を取得する(WHERE句)
次に、条件を指定して最大値・最小値を取得する方法を見ていきます。条件の指定にはWHERE句を使います。
検索クエリ
居住地が東京都の人に絞って、最年長と最年少を取得する
SELECT address, MIN(age), MAX(age)
FROM users
WHERE address = '東京都';WHERE address = '東京都'で居住地が東京都の人のみに条件を絞っています。
実行結果
| address | MIN(age) | MAX(age) | 
|---|---|---|
| 東京都 | 25 | 46 | 
居住地が東京都の人の中で最年長と最年少を取得することができました。
WHERE句については下記の記事でまとめています。
 WHERE句を使って検索条件を指定する:SELECT文の基本
  WHERE句を使って検索条件を指定する:SELECT文の基本
グループ化して最大値・最小値を取得する(GROUP BY句)
次に、特定のカラムでグループ化した上で、グループごとの最大値・最小値を取得する方法を見ていきます。
グループ化にはGROUP BY句を使います。
検索クエリ
居住地でグルーピングして、居住地ごとの最年長と最低齢を取得する
SELECT address, MIN(age), MAX(age)
FROM users
GROUP BY address;GROUP BY addressで居住地をグループ化しています。
実行結果
| address | MIN(age) | MAX(age) | 
|---|---|---|
| 大阪府 | 29 | 37 | 
| 東京都 | 25 | 46 | 
| 神奈川県 | 34 | 34 | 
居住地でグループ化した上で、居住地ごとの最年長と最年少を取得することができました。
GROUP BY句については下記でまとめています。
 GROUP BY句を使って集計!COUNTやHAVINGとの合わせ技も解説【SQL】
  GROUP BY句を使って集計!COUNTやHAVINGとの合わせ技も解説【SQL】
最大値・最小値を含んだレコードを取得する
MIN関数やMAX関数で指定したカラムだけを取得する方法は解説しましたが、特定のカラムの最大値や最小値を含むレコードを取得したい場合もあるでしょう。
SUM・AVG・MAX・MINのような集約関数を使ってレコードを取得したい場合はサブクエリ(副問い合わせ)を使います。
サブクエリとは、クエリの中に入れ子構造でクエリを書く手法のことです。
最も基本的なサブクエリの形が下記です。
SELECT カラム名
FROM テーブル名
WHERE カラム名 = (
  SELECT カラム名
  FROM テーブル名
);WHERE句の条件式の中に()で囲んでさらにSELECT文を記載しています。この()で囲まれたクエリがサブクエリになります。
()の中に書かれたSELECT カラム名 FROM テーブル名の実行結果をWHEREの条件として指定することができます。
それでは、MAX関数・MIN関数と併用する場合のを見てみましょう。
検索クエリ
usersテーブルの中から最年長の人のレコードを取得する
SELECT *
FROM users
WHERE age = (
  SELECT MAX(age)
  FROM users
);考え方の流れは下記です。
- SELECT文では全てのカラムを取得する*(アスタリスク)を指定
- WHERE句を使って検索条件を指定
- サブクエリを使ってageカラムの最大値を取得するクエリを書く
こうすることで、サクブエリの実行結果がageカラムの最大値となり、WHERE age = ageカラムの最大値という検索条件を作ることができます。
実行結果
| id | name | age | address | 
|---|---|---|---|
| 4 | 佐々木 | 46 | 東京都 | 
ageカラムが最大値であるidが4のレコードを取得できました。
最小値の場合も考え方は同じです。
検索クエリ
usersテーブルの中から最年少の人のレコードを取得する
SELECT *
FROM users
WHERE age = (
  SELECT MIN(age)
  FROM users
);実行結果
| id | name | age | address | 
|---|---|---|---|
| 1 | 山田 | 25 | 東京都 | 
ageカラムが最小値であるidが1のレコードを取得できました。
サブクエリ(副問い合わせ)については下記の記事で詳しくまとめています。
 【SQL】副問合せ(サブクエリ)の使い方を初心者向けに解説
  【SQL】副問合せ(サブクエリ)の使い方を初心者向けに解説
内容のまとめ
- MAX関数はカラムの最大値を取得する
- MIN関数はカラムの最小値を取得する
- それぞれ、SELECT文の後にMAX(カラム名)、MIN(カラム名)と指定する
- カラムの一部にNULLの値が含まれる場合は、NULLはないものとして処理される
- カラムの全てがNULLの値である場合は、実行結果としてNULLを取得する
- 条件を指定して最大値・最小値を取得する場合は、WHERE句を使う
- グループ化してグループごとの最大値・最小値を取得する場合は、GROUP BY句を使う
- カラムだけじゃなくて、最大値・最小値を含んだレコードを取得したい場合は、サブクエリ(副問い合わせ)を使う


