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

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)

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

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

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

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

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

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

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

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

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

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

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