Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLで最小値を取得する

この記事では、テーブル内の特定カラムの最小値を取得する方法について解説します。

特定カラムの最小値を取得するには MIN関数 を使います。

MIN関数の使い方

MIN関数 は次のように記述して使いましょう。

SELECT MIN(カラム名) FROM テーブル名;

では実際にサンプルで確認してみます。

次のサンプルテーブルを用意しました。

mysql> SELECT * FROM sample_table;
+------+----------+-------+-------+
| id   | name     | class | score |
+------+----------+-------+-------+
|    1 | Ikeda    |     1 |   138 |
|    2 | Hayakawa |     2 |   156 |
|    3 | Kosaka   |     3 |   162 |
|    4 | Tanaka   |     1 |   169 |
|    5 | Yusa     |     2 |   187 |
|    6 | Onoda    |     3 |   175 |
|    7 | Hayashi  |     1 |   159 |
|    8 | Yusa     |     2 |   187 |
|    9 | Onoda    |     3 |   148 |
+------+----------+-------+-------+
9 rows in set (0.01 sec)

では、上記テーブルの scoreカラム の最小値を取得してみましょう。

mysql> SELECT MIN(score) FROM sample_table;
+------------+
| MIN(score) |
+------------+
|        138 |
+------------+
1 row in set (0.01 sec)

このように、最小値がちゃんと取得できました!

最小値を条件をつけて取得する

では次に、最小値を取得する際に条件をつけて取得してみましょう。

例えば、idカラム が「3」以上のレコードの中から最小値を取得してみます。

次のように記述しましょう。

SELECT MIN(score) FROM sample_table WHERE id >= 3;

上記のSQL文を実行すると、次の結果が取得できます。

mysql> SELECT MIN(score) FROM sample_table WHERE id >= 3;
+------------+
| MIN(score) |
+------------+
|        148 |
+------------+
1 row in set (0.01 sec)

ちゃんと条件通りにレコードを取得できました!

では次に、 classカラム ごとに最小値を取得してみましょう。

次のように記述できます。

SELECT class, MIN(score) FROM sample_table GROUP BY class;

上記のSQL文を実行すると、次の結果が取得できます。

mysql> SELECT class, MIN(score) FROM sample_table GROUP BY class;
+-------+------------+
| class | MIN(score) |
+-------+------------+
|     1 |        138 |
|     2 |        156 |
|     3 |        148 |
+-------+------------+
3 rows in set (0.01 sec)

classカラム ごとに取得できました!

このように、最小値を求める際には条件を設定することが可能です。

最小値をHAVING句で条件指定

SQLで最小値を条件付きで指定する際に、HAVING句 を使う方法も見ていきましょう。

HAVING句 を使うことで、よりデータ・レコードを絞って取得できます。

例えば、次のようなSQL文を見ていきましょう。

SELECT class, MIN(score) FROM sample_table GROUP BY class HAVING MIN(score) >= 140;

上記のSQL文は、classカラム ごとにデータをまとめ、その上で scoreカラム の最小値が「140」以上のデータだけを取得・表示します。

実行してみると、次の結果が得られました。

mysql> SELECT class, MIN(score) FROM sample_table GROUP BY class HAVING MIN(score) >= 140;
+-------+------------+
| class | MIN(score) |
+-------+------------+
|     2 |        156 |
|     3 |        148 |
+-------+------------+
2 rows in set (0.00 sec)

140以下が最小値である classカラム が「1」のデータは表示されていませんね。

最小値の日付を取得する

最小値の取得は数値だけではありません。

日付の最小値(古い日付)を取得することもできます。

先ほどの sample_tableテーブル に日付のカラムを追加しました。

mysql> SELECT * FROM sample_table;
+------+----------+-------+-------+------------+
| id   | name     | class | score | dt         |
+------+----------+-------+-------+------------+
|    1 | Ikeda    |     1 |   138 | 2020-10-01 |
|    2 | Hayakawa |     2 |   156 | 2020-10-01 |
|    3 | Kosaka   |     3 |   162 | 2020-10-01 |
|    4 | Tanaka   |     1 |   169 | 2020-10-01 |
|    5 | Yusa     |     2 |   187 | 2020-10-15 |
|    6 | Onoda    |     3 |   175 | 2020-10-15 |
|    7 | Hayashi  |     1 |   159 | 2020-10-15 |
|    8 | Yusa     |     2 |   187 | 2020-10-15 |
|    9 | Onoda    |     3 |   148 | 2020-10-15 |
+------+----------+-------+-------+------------+
9 rows in set (0.01 sec)

このデータの日付の最小値を取得してみましょう。

次のように記述できます。

SELECT MIN(dt) FROM sample_table;

上記のSQL文の実行結果は次の通りです。

mysql> SELECT MIN(dt) FROM sample_table;
+------------+
| MIN(dt)    |
+------------+
| 2020-10-01 |
+------------+
1 row in set (0.01 sec)

期待した通りの結果が取得できています。

なお、日付の最小値を取得する際も、WHERE句 や HAVING句 で条件をつけることも可能です。

最小値を複数列から取得する

では、最小値を複数列から取得したい場合について見ていきましょう。

複数列の最小値を求めたい場合は、 SELECT句 の後ろに MIN関数 をカンマ区切りで並べればOKです。

サンプルテーブルの scoreカラム と dtカラム の最小値を求めてみましょう。

mysql> SELECT MIN(score), MIN(dt) FROM sample_table;
+------------+------------+
| MIN(score) | MIN(dt)    |
+------------+------------+
|        138 | 2020-10-01 |
+------------+------------+
1 row in set (0.00 sec)

このように、最小値を複数取得できました。

最小値でNULLがある場合はどうなる?

最小値を取得する時に「NULL値」があった場合はどうなるのでしょうか?

結論から言うと、NULL値は取得対象にはなりません

例えば、次のようにNULL値の入ったレコードを追加して最小値を取得してみましょう。

mysql> SELECT * FROM sample_table;
+------+----------+-------+-------+------------+
| id   | name     | class | score | dt         |
+------+----------+-------+-------+------------+
|    1 | Ikeda    |     1 |   138 | 2020-10-01 |
|    2 | Hayakawa |     2 |   156 | 2020-10-01 |
|    3 | Kosaka   |     3 |   162 | 2020-10-01 |
|    4 | Tanaka   |     1 |   169 | 2020-10-01 |
|    5 | Yusa     |     2 |   187 | 2020-10-15 |
|    6 | Onoda    |     3 |   175 | 2020-10-15 |
|    7 | Hayashi  |     1 |   159 | 2020-10-15 |
|    8 | Yusa     |     2 |   187 | 2020-10-15 |
|    9 | Onoda    |     3 |   148 | 2020-10-15 |
|    9 | NoData   |     3 |  NULL | NULL       |
+------+----------+-------+-------+------------+
10 rows in set (0.00 sec)

取得結果は次のようになります。

mysql> SELECT MIN(score), MIN(dt) FROM sample_table;
+------------+------------+
| MIN(score) | MIN(dt)    |
+------------+------------+
|        138 | 2020-10-01 |
+------------+------------+
1 row in set (0.01 sec)

NULL値は取得されていないですよね。

では、仮にNULL値を取得したい場合はどうするのでしょうか。

NULL値を判定したい場合は「IS NULL」を使いましょう。

次のように記述します。

SELECT * FROM sample_table WHERE score IS NULL;

上記のSQL文は、scoreカラム に NULL値 の入っているデータがあるかないかを判定します。

実行すると、次のように結果を取得可能です。

mysql> SELECT * FROM sample_table WHERE score IS NULL;
+------+--------+-------+-------+------+
| id   | name   | class | score | dt   |
+------+--------+-------+-------+------+
|    9 | NoData |     3 |  NULL | NULL |
+------+--------+-------+-------+------+
1 row in set (0.00 sec)

なお、IS NULL の使い方は次の記事でも解説しているので、ぜひ参考にしてください。

【関連記事】

▶︎SQL isnullの使い方 NULL判定やNULL置換の方法 case式でも対応可能

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。