データの極端な値の世界に飛び込もう ― 最小値と最大値の検索だよ。心配しなくてOK、SQLは新しいことを無理やり覚えさせたりしないし、テーブルの中で一番大きい値や一番小さい値を見つける方法をマスターできる。これらの関数はどこでも使われてる:IMDbの映画評価の分析から、火星の最低気温の計算まで。
MIN() と MAX() は集約関数で、データセットから最小値と最大値を返してくれる。まるで優しいエクストリームハンターみたいな感じ:MIN() は一番小さい要素を探して、MAX() は逆に一番大きい要素を探す。使えるのは数字だけじゃなくて、文字列や日付でもOK。
-- MINとMAXの基本形
SELECT
MIN(column_name) AS min_value,
MAX(column_name) AS max_value
FROM table_name;
超カンタン!じゃあ、このマジックがいろんなパターンでどう動くか見てみよう。
構文と基本例
数値データ
例えば、employees というテーブルがあって、そこに社員の給料 (salary) のカラムがあるとする。
最小給料と最大給料を知りたいとき。
テーブル employees
| id | name | salary |
|---|---|---|
| 1 | Anna Song | 45000 |
| 2 | Otto Art | 30000 |
| 3 | Maria Chi | 120000 |
| 4 | Alex Lin | 90000 |
| 5 | Eva Tan | 60000 |
-- 数値データの例
SELECT
MIN(salary) AS min_salary,
MAX(salary) AS max_salary
FROM employees;
結果
| min_salary | max_salary |
|---|---|
| 30000 | 120000 |
テキストデータ
MIN() と MAX() はテキストデータにも使えるよ。
アルファベット順で比較される(そう、文字にも「一番小さい」「一番大きい」があるんだ)。
例えば、students というテーブルがあって、name カラムに学生の名前が入ってるとする。
テーブル students
| id | name |
|---|---|
| 1 | Anna |
| 2 | Otto |
| 3 | Maria |
| 4 | Ben |
| 5 | Zoe |
-- テキストデータの例
SELECT
MIN(name) AS first_name_in_order,
MAX(name) AS last_name_in_order
FROM students;
結果
| first_name_in_order | last_name_in_order |
|---|---|
| Anna | Zoe |
日付と時間
テーブル events から一番早い日付と一番遅い日付を探すよ。
テーブル events
| id | event_name | event_date |
|---|---|---|
| 1 | New Year Party | 2023-01-01 |
| 2 | Summer Fest | 2023-06-15 |
| 3 | Halloween Bash | 2023-10-31 |
| 4 | Year End Gala | 2023-12-31 |
-- 日付データの例
SELECT
MIN(event_date) AS earliest_date,
MAX(event_date) AS latest_date
FROM events;
結果
| earliest_date | latest_date |
|---|---|
| 2023-01-01 | 2023-12-31 |
MIN() と MAX() を NULL 値があるテーブルで使う場合
もしカラムに NULL があっても、安心してOK:SQLは計算時にそれらを無視してくれる。
つまり、MIN() と MAX() は「普通の」値だけで動く。
テーブル employees_with_null
| id | name | salary |
|---|---|---|
| 1 | Otto | 30000 |
| 2 | Maria | NULL |
| 3 | Anna | 120000 |
| 4 | John | NULL |
-- NULLを含むテーブル
SELECT
MIN(salary) AS min_salary,
MAX(salary) AS max_salary
FROM employees_with_null;
salary カラムに NULL があっても、それらは単純に無視される。
| min_salary | max_salary |
|---|---|
| 30000 | 120000 |
でも、もしカラム全体が NULL だけだったら、結果も NULL になるよ。
MIN() と MAX() のリアルな使い方例
一番年上と一番若い社員を調べる
テーブル employees
| id | name | birth_date |
|---|---|---|
| 1 | Otto | 1980-05-10 |
| 2 | Maria | 1990-11-20 |
| 3 | Anna | 1975-03-15 |
| 4 | John | 2000-08-01 |
employees テーブルには birth_date という社員の誕生日を保存するカラムがある。一番年上と一番若い人を調べてみよう。
SELECT
MIN(birth_date) AS oldest_employee,
MAX(birth_date) AS youngest_employee
FROM employees;
結果:
| oldest_employee | youngest_employee |
|---|---|
| 1975-03-15 | 2000-08-01 |
売上分析
| id | amount |
|---|---|
| 1 | 150.00 |
| 2 | 75.50 |
| 3 | 200.00 |
| 4 | 120.00 |
| 5 | 500.00 |
| 6 | 90.00 |
sales テーブルには amount という売上金額のカラムがある。最小と最大の売上金額を探そう。
SELECT
MIN(amount) AS smallest_sale,
MAX(amount) AS largest_sale
FROM sales;
クエリの結果
| smallest_sale | largest_sale |
|---|---|
| 75.50 | 500.00 |
一番最初と一番最後の注文を探す
もし orders テーブルに order_date カラムがあれば、最初と最後の注文日も簡単にわかる。
元のテーブル orders
| order_id | customer_id | order_date | amount |
|---|---|---|---|
| 101 | 1 | 2023-01-15 10:23:00 | 250.00 |
| 102 | 2 | 2023-02-10 14:45:00 | 150.00 |
| 103 | 3 | 2023-01-05 09:10:00 | 300.00 |
| 104 | 1 | 2023-03-22 16:30:00 | 500.00 |
| 105 | 4 | 2023-01-25 11:00:00 | 120.00 |
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS last_order
FROM orders;
クエリの結果:
| first_order | last_order |
|---|---|
| 2023-01-05 09:10:00 | 2023-03-22 16:30:00 |
MIN() と MAX() の特徴
テキストの比較: 文字列の場合、MIN() と MAX() はアルファベット順で比較するよ。
NULL の扱い: カラムに他の値があれば NULL は無視される。でも全部 NULL なら結果も NULL になる。
日付の比較: SQLは年だけじゃなくて、月・日・時・分までちゃんと見てくれる。
GO TO FULL VERSION