SQLで最大値を取得・抽出する
この記事では、SQLでテーブル内の指定カラムの最大値を取得する方法について解説します。
最大値を求めるには MAX関数 を使いましょう。
MAX関数の使い方
MAX関数 は次のように記述して使用可能です。
SELECT MAX(カラム名) FROM テーブル名;
実際にテーブル内の最大値を取得してみましょう。
サンプルとして、次のテーブルを用意しました。
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.00 sec)
では、上記のテーブルの scoreカラム の最大値を取得してみます。
次のように記述しましょう。
SELECT MAX(score) FROM sample_table;
上記のSQL文を実行すると、次のように結果を取得できます。
+------------+ | MAX(score) | +------------+ | 187 | +------------+ 1 row in set (0.00 sec)
ちゃんと一番大きな値が取得できました。
最大値に条件をつけて取得する
最大値を取得する時に、条件をつけて取得したいこともあるでしょう。
そんな時には、「WHERE句」と「GROUP BY句」が使えます。
ここでもサンプルを紹介しますが、詳しい説明は以下の記事で解説しているので、よければ参考にしてみてください。
【関連記事】
▶︎SQLで最大値に条件を指定してデータを取得する方法を解説【サンプル付】
WHERE句で条件を指定して最大値を取得
では、WHERE句を使って最大値を取得します。
次のように記述することで、scoreカラム の値が「170」以下の中での最大値を取得可能です。
mysql> SELECT MAX(score) FROM sample_table WHERE score <= 170; +------------+ | MAX(score) | +------------+ | 169 | +------------+ 1 row in set (0.00 sec)
また、次のように日付を条件にしても取得できますね。
SELECT MAX(score) FROM sample_table WHERE dt < '2020-10-10'; 取得結果は次の通りです。 mysql> SELECT MAX(score) FROM sample_table WHERE dt < '2020-10-10'; +------------+ | MAX(score) | +------------+ | 169 | +------------+ 1 row in set (0.01 sec)
このように、WHERE句でさまざまな条件を指定できます。
GROUP BY句で条件を指定して最大値を取得
次に、GROUP BY句を使って最大値を取得します。
例えば、classカラムごとにグループ化することで、それぞれのグループごとの最大値を抽出可能です。
SELECT class, MAX(score) FROM sample_table GROUP BY class;
上記のSQL文を実行すると、次のように結果を取得できました。
mysql> SELECT class, MAX(score) FROM sample_table GROUP BY class; +-------+------------+ | class | MAX(score) | +-------+------------+ | 1 | 169 | | 2 | 187 | | 3 | 175 | +-------+------------+ 3 rows in set (0.00 sec)
各クラスごとの最大値が取得できていますね。
このように、最大値の取得にはさまざまな条件を指定することが可能です。
最大値が含まれたレコードを取得する
最大値だけでなく、レコードの中身すべてを取得したいのですが可能ですか?
はい、できます! 最大値が含まれたレコードを取得したい場合は【サブクエリ(副問い合わせ)】を使いましょう!
ここまで、最大値を取得・抽出する方法と条件の指定方法を解説しました。
SQL操作の際に、最大値が含まれたレコードを取得したい場合もありますよね。
そんな時は、下記のように記述することで、最大値が含まれたレコードを取得できます。
SELECT * FROM sample_table WHERE score = (SELECT MAX(score) FROM sample_table);
実行すると次のように結果が取得できました。
mysql> SELECT * FROM sample_table WHERE score = (SELECT MAX(score) FROM sample_table); +------+------+-------+-------+------------+ | id | name | class | score | dt | +------+------+-------+-------+------------+ | 5 | Yusa | 2 | 187 | 2020-10-15 | | 8 | Yusa | 2 | 187 | 2020-10-15 | +------+------+-------+-------+------------+ 2 rows in set (0.01 sec)
今回用意したテーブルでは、最大値を含むレコードが2つありました。
このように、最大値があるレコードすべてを取得可能です。
日付の最大値を取得する
最大値の取得は、数値だけでなく日付でも取得できます。
日付の最大値とは、つまり「最新の日付」のことです。
先ほどのサンプルで日付の最大値を取得してみましょう。
次のようにSQL文を記述します。
SELECT MAX(dt) FROM sample_table;
実行結果は次の通りです。
mysql> SELECT MAX(dt) FROM sample_table; +------------+ | MAX(dt) | +------------+ | 2020-10-15 | +------------+ 1 row in set (0.01 sec)
テーブル内の最新日付が取得できました。
「最大値が含まれたレコードを取得する」で紹介した、サブクエリを使って最新の日付のレコードを取得することも可能です。
scoreカラム を dtカラム に指定するだけですね。
次のように記述できます。
SELECT * FROM sample_table WHERE dt = (SELECT MAX(dt) FROM sample_table);
実行結果は次の通りです。
mysql> SELECT * FROM sample_table WHERE dt = (SELECT MAX(dt) FROM sample_table); +------+---------+-------+-------+------------+ | id | name | class | score | dt | +------+---------+-------+-------+------------+ | 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 | +------+---------+-------+-------+------------+ 5 rows in set (0.00 sec)
dtカラム の日付が最新のレコードだけが取得できました!
最大値を複数取得する
最後に、最大値を複数のカラムから取得する方法です。
これはとても簡単で、最大値を取得したいカラムをカンマ区切りで並べるだけでOKです。
mysql> SELECT MAX(score), MAX(dt) FROM sample_table; +------------+------------+ | MAX(score) | MAX(dt) | +------------+------------+ | 187 | 2020-10-15 | +------------+------------+ 1 row in set (0.00 sec)
このように、それぞれのカラムの最大値が取得できているのがわかります。
また、サブクエリ内でも最大値を複数組み合わせて指定可能です。
わかりやすくするために、テーブルのレコードを少し変更しました。
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-20 | | 9 | Onoda | 3 | 148 | 2020-10-15 | +------+----------+-------+-------+------------+ 9 rows in set (0.00 sec)
上記のテーブルの状態で、以下のSQL文を実行してみます。
SELECT * FROM sample_table WHERE score = (SELECT MAX(score) FROM sample_table) AND dt = (SELECT MAX(dt) FROM sample_table);
上記のSQLは、scoreカラム と dtカラム がそれぞれ最大値のレコードを取得するという意味です。
実行してみると、次のようにレコードを取得できました。
mysql> SELECT * FROM sample_table WHERE score = (SELECT MAX(score) FROM sample_table) AND dt = (SELECT MAX(dt) FROM sample_table); +------+------+-------+-------+------------+ | id | name | class | score | dt | +------+------+-------+-------+------------+ | 8 | Yusa | 2 | 187 | 2020-10-20 | +------+------+-------+-------+------------+ 1 row in set (0.00 sec)