PR

【SQL】MAX関数(SELECT MAX)を1分でわかりやすく解説

Database

指定したカラムの「最大値」を取得するMAX関数の使い方を、初心者向けに1から解説します。

MAX関数は、指定したカラムのレコードの最大値を取得します。「MAX」は、最大を意味する「Maximum」の略です。

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

たとえば、国語の点数が708060なら、MAX関数が返す値は80です。

MAX関数が返すのは、条件に合う値の中で一番大きな値です。まずはこの点を押さえればOKです。

このページでは、SQLにおけるMAX関数の使い方と構文ルールを、成績表の例を使って説明します。

このページで学べる内容
  • MAX関数の使い方・構文ルール
  • NULL値と日付を含む場合の動き
  • GROUP BY句でグループごとの最大値を取得する方法
  • 最大値を持つ行全体を取得する方法
スポンサーリンク

SQL:MAX関数の使い方・構文ルール

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

参考 SELECT文とは?

MAX関数は、SUM関数AVG関数など、ほかの集約関数と同じように記述します。

「MAX(カラム名)」のように、最大値を求めたいカラムを丸括弧で囲むだけです。

ここでは、次のPointListテーブルを例に、MAX関数の処理結果を見ていきます。

Student Class Japanese Math English
Aさん 1組 70 80 65
Bさん 1組 80 75 90
Cさん 2組 60 95 85
Dさん 2組 NULL 70 75

成績の一覧から、Japaneseカラムの最大値を取得する場合は、次のように記述します。

SELECT MAX(Japanese) AS max_japanese
  FROM PointList;

実行結果は80です。

max_japanese
------------
80

国語・数学・英語の最大値を、1回のSQLで取得することもできます。

SELECT MAX(Japanese) AS max_japanese,
       MAX(Math)     AS max_math,
       MAX(English)  AS max_english
  FROM PointList;
max_japanese | max_math | max_english
-------------+----------+------------
80           | 95       | 90

ここで返るのは「各カラムの最大値」です。国語の80はBさん、数学の95はCさんの値なので、同じ生徒の1行が返るわけではありません。

COUNT関数とは異なり、MAX関数では比較するカラムを指定する必要があります。MAX(*)とは書けません。

-- 誤り
SELECT MAX(*) FROM PointList;

-- 正しい
SELECT MAX(Math) FROM PointList;

MAX関数:NULL値の扱い

指定したカラムにNULL値がある場合、MAX関数はNULL値を除外して最大値を求めます。

先ほどのJapaneseカラムでは、Dさんの値がNULLです。MAX関数は残りの708060を比較するため、結果は80になります。

ただし、対象になる値がすべてNULLの場合は、結果もNULLです。

SELECT MAX(Japanese) AS max_japanese
  FROM PointList
 WHERE Student = 'Dさん';
max_japanese
------------
NULL

NULLを0として扱う場合は、データベース製品に応じてCOALESCENVLを使います。ただし、「値がない」と「0」は意味が異なるため、業務上同じ扱いでよいかを確認してください。

MAX関数で日付の最大値を取得する

MAX関数は数値だけでなく、日付にも利用できます。日付の最大値は、最も新しい日付です。

たとえば、Ordersテーブルから最終注文日を取得する場合は、次のように記述します。

SELECT MAX(order_date) AS latest_order_date
  FROM Orders;

反対に、MIN(order_date)なら最も古い日付を取得できます。

文字列型にもMAX関数を使えるデータベースは多いですが、大小は照合順序の規則に従います。見た目の五十音順や辞書順と一致するとは限りません。

MAX関数とGROUP BY句を組み合わせる

MAX関数とGROUP BY句を組み合わせると、指定したグループごとに最大値を取得できます。

先ほどのPointListテーブルから、クラスごとの国語の最高点を求めてみましょう。

SELECT Class,
       MAX(Japanese) AS max_japanese
  FROM PointList
 GROUP BY Class;
Class | max_japanese
------+-------------
1組   | 80
2組   | 60

ご覧のように、GROUP BY Classで行をクラスごとに分け、その中でMAX(Japanese)が計算されます。

クラスごとの計算

  • 1組:7080を比較し、80を返す
  • 2組:60とNULLを比較し、60を返す

MAX関数で最大値を持つ行を取得する

MAX関数だけで取得できるのは、最大値そのものです。最高点を取った生徒名など、最大値を持つ行全体を取得したい場合は、サブクエリなどを使います。

SELECT Student, Class, Japanese, Math, English
  FROM PointList
 WHERE Math = (
       SELECT MAX(Math)
         FROM PointList
 );

このSQLでは、数学の最高点95を持つCさんの行を取得できます。同点1位が複数人いれば、該当する行はすべて返ります。

MAX関数のまとめ

  • MAX(カラム名)は、指定したカラムの最大値を取得する
  • NULLは除外されるが、対象がすべてNULLなら結果もNULLになる
  • 日付の最大値は最も新しい日付になる
  • GROUP BY句と組み合わせると、グループごとの最大値を取得できる
  • 最大値を持つ行全体が必要なら、サブクエリなどを使う

SQLを基礎から順番に学びたい方は、SQL初心者向け学習ロードマップもあわせてご覧ください。

タイトルとURLをコピーしました