この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:29:05

タイトル: max
SEOタイトル: プログラミング・SQLにおける max 関数の使い方完全ガイド - Java / JavaScript / Python / SQL

この記事の要点
  • max は "最大値" を返す関数。各言語・各 DB に存在する基本的な関数
  • Java: Math.max(a, b) / Stream.max() / Collections.max(list)
  • JavaScript: Math.max(...arr)(スプレッド構文)/ arr.reduce()
  • Python: max(a, b) / max(list) / max(list, key=lambda x: x.age)
  • SQL: MAX() 集約関数(GROUP BY と組合せ)/ GREATEST() 行内最大

max とは

max(マックス)はプログラミング言語や SQL に存在する基本関数で、与えられた値のうち最大のものを返します。同名・近い名前の関数が複数のレイヤで存在するため、文脈に応じて使い分けます。

レイヤ典型シグネチャ用途
2引数 maxmax(a, b)2 値のうち大きい方
可変長 maxmax(a, b, c, ...)3 つ以上の最大
コレクション maxmax(list)配列・リスト内の最大
集約 MAXSELECT MAX(col) FROM tSQL の集約関数(列方向の最大)
行内 GREATESTGREATEST(a, b, c)SQL の行内(横方向)最大

Java の max

// Math.max (2引数のみ。プリミティブ型用)
int a = Math.max(3, 5);                 // 5
double d = Math.max(1.2, 3.4);          // 3.4
long l = Math.max(100L, 200L);          // 200

// 3 つ以上は入れ子
int max3 = Math.max(Math.max(a, b), c);
int max4 = Math.max(Math.max(a, b), Math.max(c, d));

// Collections.max(List 等のコレクション全体)
List<Integer> list = List.of(3, 1, 4, 1, 5, 9, 2, 6);
int max = Collections.max(list);        // 9

// Stream で複雑な比較
Optional<Person> oldest = people.stream()
    .max(Comparator.comparingInt(Person::getAge));
Optional<Integer> maxI = list.stream().max(Comparator.naturalOrder());
int maxPrimitive = list.stream().mapToInt(Integer::intValue).max().orElse(0);

// IntStream.max (プリミティブ版)
int maxArr = IntStream.of(1, 2, 3, 4, 5).max().orElse(0);

JavaScript の max

// 2引数以上
Math.max(1, 2, 3);                   // 3
Math.max(-5, 0, 5);                  // 5

// 配列はスプレッド構文で渡す
const arr = [3, 1, 4, 1, 5, 9, 2, 6];
Math.max(...arr);                    // 9

// 引数なし → -Infinity(!)
Math.max();                          // -Infinity

// 大きな配列はスタック溢れに注意(10万件超で危険)
Math.max.apply(null, hugeArray);     // 同じく危険

// 巨大配列は reduce 推奨
const max = hugeArray.reduce((m, v) => v > m ? v : m, -Infinity);

// オブジェクト配列の特定キーで最大
const oldest = users.reduce((a, b) => a.age > b.age ? a : b);

// NaN が含まれる場合
Math.max(1, NaN, 3);                 // NaN(伝播)

Python の max

# 2引数以上
max(1, 2, 3)                         # 3
max(-5, 0, 5)                        # 5

# イテラブル(リスト・タプル・set)
max([3, 1, 4, 1, 5, 9, 2, 6])        # 9
max((1, 2, 3))                       # 3
max({3, 1, 4})                       # 4

# キー指定(複雑な比較)
users = [{'name': 'A', 'age': 25}, {'name': 'B', 'age': 30}]
oldest = max(users, key=lambda u: u['age'])    # {'name': 'B', 'age': 30}

# 文字列は辞書順
max(['banana', 'apple', 'cherry'])   # 'cherry'
max('hello')                         # 'o'

# 空イテラブル → ValueError、default 指定で回避
max([], default=0)                   # 0

# 同値時は最初の要素が返る
max([(1, 'a'), (1, 'b')], key=lambda x: x[0])  # (1, 'a')

SQL の MAX

SQL の MAX()集約関数で、列方向(縦方向)の最大値を求めます:

-- 全行から最大
SELECT MAX(price) FROM products;
SELECT MAX(created_at) FROM orders;       -- 最新の日付

-- グループごとの最大
SELECT category_id, MAX(price) AS max_price
  FROM products
 GROUP BY category_id;

-- HAVING で MAX を条件に
SELECT user_id, MAX(score) AS top_score
  FROM games
 GROUP BY user_id
HAVING MAX(score) >= 1000;

-- 文字列の MAX は辞書順(ASCII / UTF-8)
SELECT MAX(name) FROM users;

GREATEST(行内・横方向の最大)

-- 同じ行内の複数列から最大
-- 例: 3教科のテスト点数のうち最高
SELECT user_id,
       GREATEST(math, english, science) AS best_score
  FROM scores;

-- NULL の扱いに注意(MySQL/Oracle は NULL 含むと結果も NULL)
SELECT GREATEST(1, NULL, 3);     -- NULL
SELECT GREATEST(COALESCE(math, 0),
                COALESCE(english, 0),
                COALESCE(science, 0)) AS best_score
  FROM scores;

-- 反対は LEAST(最小)
SELECT LEAST(math, english, science) FROM scores;

言語別 max クイック比較

言語2 引数可変長コレクション
JavaMath.max(a, b)不可(入れ子で代用)Collections.max(list) / stream().max()
JavaScriptMath.max(a, b)Math.max(a, b, c)Math.max(...arr)
Pythonmax(a, b)max(a, b, c)max(list)
C++std::max(a, b)std::max({a,b,c})*std::max_element(v.begin(), v.end())
SQLGREATEST(a, b)GREATEST(a, b, c)MAX(col) 集約
GoGo 1.21+ max(a, b)max(a, b, c)自前 reduce

パフォーマンスの注意

  • SQL MAX(col)該当列に INDEX があれば O(log n)、無ければ O(n) のフルスキャン
  • JavaScript Math.max(...hugeArray)10 万要素くらいでスタック溢れのリスク。reduce 推奨
  • Java の Stream .max(comparator) は内部的に逐次比較で O(n)。並列ストリームで分割可能
  • Python の max(list, key=fn)fn が要素ごとに 1 回だけ呼ばれる(メモ化不要)

FAQ

Q: NULL / NaN / undefined を含む場合の動作は?
A: 言語ごとに異なります。JavaScript Math.max(1, NaN) は NaN、Python max([1, float('nan')]) は環境依存、SQL MAX は NULL を無視して集約。仕様を確認してから使うこと。

Q: SQL で各カテゴリの最高価格商品を 1 つ取りたい
A: MAX(price) だけだと商品名が取れません。ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) = 1 や、相関サブクエリ、JOIN を使います。

Q: max と Math.max の違いは(JavaScript)?
A: JavaScript には素の max 関数はなく、必ず Math.max を経由します。