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 の使い方は次の記事でも解説しているので、ぜひ参考にしてください。
【関連記事】