SQL MAX 関数

MAX()は最大値を返すOracle SQL関数です。テーブルのカラムの最大値を求めるときなどに使います。この記事では、MAX関数の使い方をサンプルを交えて紹介しています。

MAX
DBMS MAX
MySQL
Oracle
PostgreSQL
SQL Server

使い方

最大値のレコードを取得するには、MAX関数を使う。

SELECT MAX(sal) FROM emp
SELECT MAX(ALL sal) FROM emp
SELECT MAX(DISTINCT sal) FROM emp

ALLを指定すると、値が重複するレコードすべてを対象とする。

DISTINCTを指定すると、値が重複するレコードのうち、ひとつだけを対象とする。

ただし、ALLやDISTINCTを指定しても最大値は変わらない。

SQL MAX 関数
Figure 1. SQL MAX 関数

NULL

MAX関数の集計対象となる列にNULLが含まれていても、最大値を求めることができる。すべての列がNULLだった場合、MAX関数はNULLを返す。

DATE日付

日付(DATE型)に対してもMAX関数を使える。日付に対してMAX関数を使ったときは日付の最大値、つまり最新の日付が返される。

たとえば次のようなテーブルがあったとする。

empテーブル
ename hiredate
Fujihira Kano 2015/05/06 17:30:00
Tanaka Miku 2017/05/07 18:00:00
Satou Neo 2019/05/06 15:30:00

雇用日付(hiredate)の最大値(最新日付)を求めるには、次のSQLを使う。

SELECT MAX(hiredate) FROM emp

上記SQLの実行結果は次のようになる。

MAX(hiredate)
2019/05/06 15:30:00

文字列

文字列に対してもMAX関数を使うことができる。

たとえば次のようなテーブルがあったとする。

empテーブル
ename
Fujihira Kano
Tanaka Miku
Satou Neo

社員名(ename)の最大値を求めるには、次のSQLを使う。

SELECT MAX(ename) FROM emp

上記SQLの実行結果は次のようになる。

MAX(ename)
Satou Neo

あくまでも文字列として比較されることに注意が必要である。たとえば、文字列で「2」と「10」を比較すると、先頭の文字から順に比較されるため、最大値は「2」である。

WHERE

条件にMAX関数を使うこともできる。

給与(sal)が最大のレコードを取得するには、次のSQLを使う。

SELECT * FROM emp WHERE sal = (SELECT MAX(sal) FROM emp)

GROUP BY

グルーピングしてグループごとの最大値を返す例を示す。このサンプルでは、社員テーブルから部署(deptno)ごとに給与の最大値を取得している。

SELECT deptno, MAX(sal) FROM emp GROUP BY deptno

複数列

レコードの複数列から最大値を取得するには、MAX関数ではなく、GREATEST関数を使う。

SELECT GREATEST(sal, comm) FROM emp

MIN

MAXは最大値を返す関数であるが、逆に最小値を求める場合には、MIN関数を使う。

PostgreSQL

PostgreSQL で最大値のレコードを取得するには、MAX関数を使う。使い方はOracleと同じである。

SELECT MAX(sal) FROM emp

SQL Server

SQL Server で最大値のレコードを取得するには、MAX関数を使う。使い方はOracleと同じである。

SELECT MAX(sal) FROM emp
SELECT MAX(ALL sal) FROM emp
SELECT MAX(DISTINCT sal) FROM emp