MAX() 函數 (SQL MAX() Function)
MAX() 是一個聚合函數 (Aggregate Function),用於取得指定欄位中的最大值。它可以用於數值、字串和日期類型的欄位,會忽略 NULL 值。
MAX() 語法 (Syntax)
SELECT MAX(column_name) FROM table_name [WHERE condition];
MAX() 用法範例 (Example)
orders 資料表:
| O_Id | Price | Customer | OrderDate |
|---|---|---|---|
| 1 | 1000 | 張一 | 2024-01-15 |
| 2 | 2000 | 王二 | 2024-02-20 |
| 3 | 500 | 李三 | 2024-01-10 |
| 4 | 1300 | 張一 | 2024-03-05 |
| 5 | 1800 | 王二 | 2024-02-28 |
範例 1:取得最高訂單金額
SELECT MAX(Price) AS MaxPrice
FROM orders;
結果:
| MaxPrice |
|---|
| 2000 |
範例 2:取得最新訂單日期
SELECT MAX(OrderDate) AS LatestOrder
FROM orders;
結果:
| LatestOrder |
|---|
| 2024-03-05 |
MAX() 搭配 WHERE 條件
查詢「張一」的最高訂單金額:
SELECT MAX(Price) AS MaxPrice
FROM orders
WHERE Customer = '張一';
結果:
| MaxPrice |
|---|
| 1300 |
MAX() 搭配 GROUP BY
使用 GROUP BY 取得每個群組的最大值:
SELECT Customer, MAX(Price) AS MaxPrice
FROM orders
GROUP BY Customer;
結果:
| Customer | MaxPrice |
|---|---|
| 張一 | 1300 |
| 王二 | 2000 |
| 李三 | 500 |
MAX() 用於字串
對於字串欄位,MAX() 會返回按字母順序排列的最後一個值:
products 資料表:
| P_Id | Name |
|---|---|
| 1 | Apple |
| 2 | Banana |
| 3 | Cherry |
SELECT MAX(Name) AS LastProduct
FROM products;
結果:
| LastProduct |
|---|
| Cherry |
找出最大值對應的記錄
MAX() 只返回最大值本身,如果要取得對應的完整記錄,需要使用子查詢或其他方法:
方法 1:使用子查詢
SELECT *
FROM orders
WHERE Price = (SELECT MAX(Price) FROM orders);
方法 2:使用 ORDER BY + LIMIT
SELECT *
FROM orders
ORDER BY Price DESC
LIMIT 1;
方法 3:使用窗口函數
SELECT *
FROM (
SELECT *, RANK() OVER (ORDER BY Price DESC) AS rnk
FROM orders
) ranked
WHERE rnk = 1;
找出每組的最大值記錄
找出每位顧客的最高金額訂單:
-- 方法 1:使用相關子查詢
SELECT *
FROM orders o1
WHERE Price = (
SELECT MAX(Price)
FROM orders o2
WHERE o2.Customer = o1.Customer
);
-- 方法 2:使用窗口函數
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Price DESC) AS rn
FROM orders
) ranked
WHERE rn = 1;
MAX() 與 NULL 值
MAX() 會忽略 NULL 值:
-- 假設有些 Price 為 NULL
SELECT MAX(Price) FROM orders;
-- 只考慮非 NULL 的值
如果所有值都是 NULL,MAX() 返回 NULL。
MAX() 搭配 HAVING
SELECT Customer, MAX(Price) AS MaxPrice
FROM orders
GROUP BY Customer
HAVING MAX(Price) > 1000;
MAX() 與窗口函數
計算全域最大值或分組最大值,同時保留原始記錄:
SELECT
O_Id,
Customer,
Price,
MAX(Price) OVER () AS OverallMax,
MAX(Price) OVER (PARTITION BY Customer) AS CustomerMax
FROM orders;
結果:
| O_Id | Customer | Price | OverallMax | CustomerMax |
|---|---|---|---|---|
| 1 | 張一 | 1000 | 2000 | 1300 |
| 4 | 張一 | 1300 | 2000 | 1300 |
| 2 | 王二 | 2000 | 2000 | 2000 |
| 5 | 王二 | 1800 | 2000 | 2000 |
| 3 | 李三 | 500 | 2000 | 500 |