MariaDB の SQL 文と構造における MAX 関数:詳細解説と応用例


MAX 関数は、指定した列から最大値を取得する SQL 関数です。単一の列から最大値を取得するだけでなく、複数の列の最大値を比較して最大値を取得するなど、様々な用途に使用できます。

構文

MAX(column_name)
  • column_name: 最大値を取得したい列の名前

SELECT MAX(salary)
FROM employees;

このクエリは、employees テーブルの salary 列から最大給与を取得します。

引数

MAX 関数は、以下の引数を受け取ることができます。

  • OVER(): ウィンドウ関数として使用します。
  • DISTINCT: 重複する値を除外します。
  • column_name: 最大値を取得したい列の名前

DISTINCT オプション

DISTINCT オプションを使用すると、重複する値を除外して最大値を取得できます。

SELECT MAX(DISTINCT salary)
FROM employees;

このクエリは、employees テーブルの salary 列から重複する給与を除外して最大給与を取得します。

OVER() オプション

OVER() オプションを使用すると、ウィンドウ関数として MAX 関数を使用できます。ウィンドウ関数を使用すると、特定の行グループ内の最大値を取得できます。

SELECT department_id, MAX(salary) OVER (PARTITION BY department_id)
FROM employees;

このクエリは、employees テーブルの各部門における最大給与を取得します。

MAX 関数の注意点

  • 列に値がない場合は、NULL が返されます。
  • NULL 値は最大値として考慮されません。

応用例

MAX 関数は、様々な場面で使用できます。以下に、いくつかの例を示します。

  • ウィンドウ関数を使用して、特定の行グループ内の最大値を取得する
  • 複数の列の最大値を比較して最大値を取得する
  • 特定の列における最大値を取得する


SELECT MAX(salary)
FROM employees;

複数の列の最大値を比較して最大値を取得する

SELECT MAX(price), MAX(quantity)
FROM products;

このクエリは、products テーブルの price 列と quantity 列の最大値を比較して、それぞれ最大の値を取得します。

DISTINCT オプションを使用して重複する値を除外する

SELECT MAX(DISTINCT salary)
FROM employees;

OVER() オプションを使用してウィンドウ関数として使用する

SELECT department_id, MAX(salary) OVER (PARTITION BY department_id)
FROM employees;

条件付きで最大値を取得する

SELECT MAX(salary)
FROM employees
WHERE department_id = 1;

このクエリは、employees テーブルの department_id が 1 の従業員の最大給与を取得します。

SELECT department_id, AVG(salary), MAX(salary)
FROM employees
GROUP BY department_id;


サブクエリを使用する

SELECT (SELECT MAX(salary) FROM employees) AS max_salary;

このクエリは、employees テーブルの salary 列から最大給与を取得するサブクエリを使用して、MAX 関数の代わりに最大値を取得します。

CASE 式を使用する

SELECT salary,
       CASE WHEN salary = (SELECT MAX(salary) FROM employees)
           THEN '最大値'
           ELSE ''
       END AS is_max
FROM employees;

このクエリは、CASE 式を使用して、employees テーブルの各行の salary 列の値と、employees テーブル全体の最大給与を比較し、一致する場合は '最大値' を、そうでない場合は空文字列を出力します。

ウィンドウ関数を使用する

SELECT salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;

このクエリは、ウィンドウ関数 ROW_NUMBER を使用して、employees テーブルの salary 列の値を降順に並べ替え、各行に順位を割り当てます。その後、順位が 1 の行のみを選択することで、最大値を取得します。

GROUP BY 句と集計関数を使用する

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;

このクエリは、employees テーブルを department_id 列でグループ化し、各グループにおける最大給与を MAX 集計関数を使用して取得します。

最適な代替方法の選択

最適な代替方法は、データ量、パフォーマンス要件、必要な機能などによって異なります。

  • グループ化されたデータの最大値を取得する必要がある場合は、GROUP BY 句と集計関数が最適な方法です。
  • パフォーマンスが重要であれば、ウィンドウ関数がより効率的な場合があります。
  • データ量が少ない場合は、サブクエリや CASE 式がシンプルな解決策となる場合があります。

上記以外にも、MAX 関数の代替方法はいくつかあります。

  • ユーザー定義関数を作成する
  • カーソルを使用する