來 dive 一下資料裡的極端值吧——怎麼找最小和最大的數值。別擔心,SQL 不會讓你學什麼超難的新東西,但我們會學會怎麼在表格裡找到最大和最小的資料。這些函數超常用:從分析 IMDb 電影評分到算火星最低溫度都會用到。
MIN() 跟 MAX() 是聚合函數,會從一堆資料裡回傳最小值和最大值。它們就像極值獵人一樣:MIN() 找最小的,MAX() 則找最大的。這不只限於數字啦:你也可以找最小和最大的字串或日期。
-- 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 |
在有 NULL 值的表格裡用 MIN() 和 MAX()
如果欄位裡有 NULL,你可以放心睡覺: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