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