SQL

【SQL】SELECT MAXの使い方(最大値)

SELECT MAXの基本構文

SQLのMAX関数を使うことで、その列の最大値を取得できます。

MAXの基本構文

SELECT  MAX(列名)  FROM  テーブル名;

本記事では、MAX関数を使用した最大値を取得する方法を解説していきます。

また「userテーブル」には、次のようなデータが格納されていることを前提としています。

【userテーブル】

ID (id) ※PK名前 (name)住所 (address)年齢 (age)部署ID (department_id)
1001鈴木一郎東京都441
1002佐藤次郎埼玉県321
1003田中三郎千葉県242
1004伊藤四郎東京都222
1005斎藤五郎東京都354

指定列の最大値を取得する

「SELECT  MAX(列名)」で、指定した列名の最大値を取得できます。

次の例では、年齢 (age)の最大値を取得しています。

■MAX(列名)の使用例

SELECT MAX(age) FROM user;

■実行結果

+----------+
| MAX(age) |
+----------+
|       44 |
+----------+
1 row in set (0.01 sec)

最大値のレコードを取得する

次の例では、IDが最大値のレコードを取得しています。

■最大値のレコード取得

SELECT 
    * 
FROM 
    user 
WHERE 
    id = (SELECT MAX(id) FROM user)

■実行結果

+-------+----------+---------+------+----------^----+
| id    | name     | address | age  | department_id |
+-------+----------+---------+------+---------------+
| 1005  | 斎藤五郎 | 東京都  |   35 |             4 |
+-------+----------+---------+------+---------------+
1 row in set (0.00 sec)

グループ化して最大値を取得する

GROUP BY句を用いてグループ化することで、グループ化ごとの最大値を求めることができます。

次の例では、部署ID (department_id)でグループ化し、部署ごとに一番高い年齢 (age)を求めています。

■GROUP BYを用いたMAX関数の使用例

SELECT 
    department_id, MAX(age)
FROM 
    user 
GROUP BY 
    department_id;

■実行結果

+---------------+----------+
| department_id | MAX(age) |
+---------------+----------+
|             1 |       44 |
|             2 |       24 |
|             4 |       35 |
+---------------+----------+
3 rows in set (0.00 sec)

続いての例では、部署ID (department_id)でグループ化し、同じ部署内で年齢 (age)が一番高い人の名前 (name)、住所 (address)、年齢 (age)を求めています。

■GROUP BYを用いたMAX関数の使用例2

SELECT 
   name, address, MAX(age), department_id
FROM 
    user 
GROUP BY 
    department_id;

上記のSQLはエラー(MySQLの場合はエラーにならない)になってしまうため、下記のようなSQLで取得できます。

■GROUP BYを用いたMAX関数の使用例3

SELECT 
    name, address, age, department_id 
FROM 
    user as user1
    INNER JOIN (
        SELECT department_id as id, MAX(age) as maxAge 
        FROM sampledb.user GROUP BY department_id 
    ) user2
    ON user1.department_id = user2.id AND user1.age = user2.maxAge

■実行結果

+----------+---------+----------+---------------+
| name     | address | MAX(age) | department_id |
+----------+---------+----------+---------------+
| 鈴木一郎 | 東京都  |       44 |             1 |
| 田中三郎 | 千葉県  |       24 |             2 |
| 斎藤五郎 | 東京都  |       35 |             4 |
+----------+---------+----------+---------------+
3 rows in set (0.00 sec)

helpful