PostgreSQLのMAX・MIN完全解説|集約関数とGROUP BYで最大値・最小値を抽出する方法
生徒
「PostgreSQLで一番大きい値とか、一番小さい値を調べたいときはどうすればいいんですか?」
先生
「そのときに使うのがMAXとMINです。テストの最高点や最低点を探すような感覚で使えます。」
生徒
「パソコンが苦手で、数字を見るだけでも不安なんですが大丈夫ですか?」
先生
「大丈夫です。紙に書いた表を見ながら、一番上と一番下を探す感覚で説明します。」
1. SQLとは何か?
SQLは、データベースという「たくさんの情報を表の形で保存する場所」に指示を出すための言葉です。住所録や名簿、売上表のようなものを、パソコンの中で扱うために使います。
PostgreSQLは、そのSQLを使って操作できるデータベースの一種で、無料で使えることから多くの現場で利用されています。
2. MAXとMINは何をする集約関数なのか
MAXとMINは、集約関数と呼ばれるSQLの命令です。集約関数とは、たくさんのデータをまとめて計算するための命令のことです。
MAXは「最大値」、MINは「最小値」を求めます。たとえば、クラス全員の身長の中で一番高い人、一番低い人を探すイメージです。
3. サンプルテーブルを見てみよう
ここでは、年齢が登録されているユーザー表を例に説明します。まずはSQLを実行する前の表を見てください。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
この表は、紙の名簿と同じです。年齢の列を縦に見て、一番大きい数字や小さい数字を探すと、MAXとMINの意味が分かります。
4. MAXで最大値を取得する方法
年齢の中で一番大きい値、つまり最年長の年齢を調べたい場合はMAXを使います。
SELECT MAX(age)
FROM users;
max
----
30
結果は30です。鈴木一郎さんの年齢が一番高いことが分かります。人が目で確認する代わりに、PostgreSQLが自動で探してくれています。
5. MINで最小値を取得する方法
次に、一番小さい年齢、つまり最年少の年齢を調べてみます。今度はMINを使います。
SELECT MIN(age)
FROM users;
min
----
19
最小値は19です。佐藤花子さんが一番年齢が低いことが分かります。MAXとMINは書き方がとても似ているので、セットで覚えると楽です。
6. 文字列でもMAXとMINが使える理由
MAXとMINは数字だけでなく、文字にも使えます。文字の場合は、あいうえお順、アルファベット順で比較されます。
SELECT MAX(name), MIN(name)
FROM users;
max | min
--------+--------
高橋次郎 | 佐藤花子
これは辞書順で比較されている結果です。文字でも順番があるという点を覚えておくと、混乱しにくくなります。
7. GROUP BYと一緒に使うMAX・MIN
GROUP BYを使うと、グループごとに最大値や最小値を求められます。たとえば部署ごとの最高年齢を調べる場合です。
id | department | age
---+------------+-----
1 | 営業 | 25
2 | 営業 | 30
3 | 開発 | 22
4 | 開発 | 28
SELECT department, MAX(age), MIN(age)
FROM users
GROUP BY department;
department | max | min
-----------+-----+----
営業 | 30 | 25
開発 | 28 | 22
部署ごとに年齢の幅が分かります。GROUP BYは「分類してから計算する」と覚えると理解しやすいです。
8. MAX・MINを使うときの注意点
MAXとMINは、NULLという「値が入っていない状態」を自動的に無視します。これは空白とは違い、「まだ決まっていない」という意味です。
また、最大値や最小値が分かっても、「その値を持つ人の名前」までは分かりません。誰なのかを知りたい場合は、別のSQLが必要になる点も覚えておきましょう。
9. MAX・MINを使いこなす考え方
MAXとMINは、データの中から代表的な値を取り出すための便利な道具です。表を上から下まで眺めて探す作業を、機械に任せているだけだと考えてください。
どの列を比べているのか、どんなデータが入っているのかを意識することで、PostgreSQLの集約関数は安心して使えるようになります。