SQL MIN 関数

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

MIN
DBMS MIN
MySQL
Oracle
PostgreSQL
SQL Server

MIN

最小値を取得する。

MIN(expr)

ALLを指定した場合は、重複する値を含めて最小値を取得する。ただし、重複する値があってもなくても最小値は変わらない。

MIN(ALL expr)

DISTINCTを指定した場合は、重複する値を含めずに取得を算出する。ただし、重複する値があってもなくても最小値は変わらない。

MIN(DISTINCT expr)

MIN関数を使用したSQLのサンプルを示す。このサンプルで使用するのは、社員テーブル(emp)である。

empno ename sal comm deptno
1 新谷ゆづみ 300 5 1
2 麻生真彩 330 10 2
3 日髙麻鈴 290 40 2

社員テーブルから歩合給(comm)の最小値を取得する。

SELECT MIN(comm) FROM emp
MIN(comm)
5

MIN(日付)

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

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

empテーブル
ename hiredate
Kurashima Sara 2014/05/05 17:30:00
Aritomo Tsugumi 2016/05/06 18:15:00
Shiratori Sana 2018/05/06 18:00:00

雇用日付(hiredate)の最小値(最も古い日付)を求めるには、次のSQLを使う。

SELECT MIN(hiredate) FROM emp

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

MIN(hiredate)
2014/05/05 17:30:00

MIN(文字列)

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

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

empテーブル
ename
Kurashima Sara
Aritomo Tsugumi
Shiratori Sana

社員名(ename)で最小値を持つレコードを求めるには、次のSQLを使う。

SELECT MIN(ename) FROM emp

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

MAX(ename)
Aritomo Tsugumi

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

GROUP BY

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

SELECT deptno, MIN(comm) FROM emp GROUP BY deptno
deptno MIN(comm)
1 5
2 10

OVER

特定のカラムを基にグルーピングして、グループごとの最小値を持つレコードを取得するには、GROUP BYを使う方法のほかに、OVERを使う方法もある。

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

empテーブル
ename sal deptno
Fujihira Kano 9800 1
Yoshida Soyoka 9000 1
Shiratori Sana 8000 2
Nonaka Kokona 7500 2

各社員の給与と部署番号、部署ごとの最低給与は次のSQLで取得できる。

SELECT sal, deptno, MIN(sal) OVER(PARTITION BY deptno) AS minsal FROM emp

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

empテーブル
sal deptno minsal
9800 1 9000
9000 1 9000
8000 2 7500
7500 2 7500

NULL

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

条件にMINを使う

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

歩合給(comm)が最小値のレコードを取得する。

SELECT * FROM emp WHERE comm = (SELECT MIN(comm) FROM emp)
empno ename sal comm deptno
1 新谷ゆづみ 300 5 1

MAX

最大値を得るには、MAX関数を使う。

SELECT MAX(sal) FROM emp

複数項目

複数の列の中から最小値を得るには、MIN関数ではなく、LEAST関数を使う。

SELECT LEAST(sal, comm) FROM emp