MIN()は最小値を返すOracle SQL関数です。テーブルのカラムの最小値を求めるときなどに使います。この記事では、MIN関数の使い方をサンプルを交えて紹介しています。
DBMS | MIN |
---|---|
MySQL | ✓ |
Oracle | ✓ |
PostgreSQL | ✓ |
SQL Server | ✓ |
最小値を取得する。
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 |
日付(DATE型)に対してもMIN関数を使える。日付に対してMIN関数を使ったときは日付の最小値、つまり最も古い日付が返される。
たとえば次のようなテーブルがあったとする。
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関数を使うことができる。
たとえば次のようなテーブルがあったとする。
ename |
---|
Kurashima Sara |
Aritomo Tsugumi |
Shiratori Sana |
社員名(ename)で最小値を持つレコードを求めるには、次のSQLを使う。
SELECT MIN(ename) FROM emp
上記SQLの実行結果は次のようになる。
MAX(ename) |
---|
Aritomo Tsugumi |
あくまでも文字列として比較されることに注意が必要である。文字列で「2」と「10」を比較すると、先頭の文字から順に比較されるため、最小値は「10」である。
グルーピングしてグループごとの最小値を返す例を示す。このサンプルでは、社員テーブルから部署(deptno)ごとに歩合給の最小値を取得している。
SELECT deptno, MIN(comm) FROM emp GROUP BY deptno
deptno | MIN(comm) |
---|---|
1 | 5 |
2 | 10 |
特定のカラムを基にグルーピングして、グループごとの最小値を持つレコードを取得するには、GROUP BYを使う方法のほかに、OVERを使う方法もある。
たとえば、次のようなテーブルがあったとする。
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の実行結果は次のようになる。
sal | deptno | minsal |
---|---|---|
9800 | 1 | 9000 |
9000 | 1 | 9000 |
8000 | 2 | 7500 |
7500 | 2 | 7500 |
MIN関数の集計対象となる列にNULLが含まれていても、最小値を求めることができる。すべての列がNULLだった場合、MIN関数はNULLを返す。
条件にMIN関数を使うこともできる。
歩合給(comm)が最小値のレコードを取得する。
SELECT * FROM emp WHERE comm = (SELECT MIN(comm) FROM emp)
empno | ename | sal | comm | deptno |
---|---|---|---|---|
1 | 新谷ゆづみ | 300 | 5 | 1 |
最大値を得るには、MAX関数を使う。
SELECT MAX(sal) FROM emp
複数の列の中から最小値を得るには、MIN関数ではなく、LEAST関数を使う。
SELECT LEAST(sal, comm) FROM emp