MAX() 最大値のレコードを取得するSQL関数

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

使い方

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

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

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

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

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

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