MAX() 函數 (SQL MAX() Function)

MAX() 是一個聚合函數 (Aggregate Function),用於取得指定欄位中的最大值。它可以用於數值、字串和日期類型的欄位,會忽略 NULL 值。

MAX() 語法 (Syntax)

SELECT MAX(column_name) FROM table_name [WHERE condition];

MAX() 用法範例 (Example)

orders 資料表:

O_IdPriceCustomerOrderDate
11000張一2024-01-15
22000王二2024-02-20
3500李三2024-01-10
41300張一2024-03-05
51800王二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;

結果:

CustomerMaxPrice
張一1300
王二2000
李三500

MAX() 用於字串

對於字串欄位,MAX() 會返回按字母順序排列的最後一個值:

products 資料表:

P_IdName
1Apple
2Banana
3Cherry
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_IdCustomerPriceOverallMaxCustomerMax
1張一100020001300
4張一130020001300
2王二200020002000
5王二180020002000
3李三5002000500

相關主題