MIN() 函數 (SQL MIN() Function)

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

MIN() 語法 (Syntax)

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

MIN() 用法範例 (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 MIN(Price) AS MinPrice
FROM orders;

結果:

MinPrice
500

範例 2:取得最早訂單日期

SELECT MIN(OrderDate) AS EarliestOrder
FROM orders;

結果:

EarliestOrder
2024-01-10

MIN() 搭配 WHERE 條件

查詢「王二」的最低訂單金額:

SELECT MIN(Price) AS MinPrice
FROM orders
WHERE Customer = '王二';

結果:

MinPrice
1800

MIN() 搭配 GROUP BY

使用 GROUP BY 取得每個群組的最小值:

SELECT Customer, MIN(Price) AS MinPrice
FROM orders
GROUP BY Customer;

結果:

CustomerMinPrice
張一1000
王二1800
李三500

MIN() 用於字串

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

products 資料表:

P_IdName
1Apple
2Banana
3Cherry
SELECT MIN(Name) AS FirstProduct
FROM products;

結果:

FirstProduct
Apple

找出最小值對應的記錄

MIN() 只返回最小值本身,如果要取得對應的完整記錄,需要使用子查詢或其他方法:

方法 1:使用子查詢

SELECT *
FROM orders
WHERE Price = (SELECT MIN(Price) FROM orders);

方法 2:使用 ORDER BY + LIMIT

SELECT *
FROM orders
ORDER BY Price ASC
LIMIT 1;

方法 3:使用窗口函數

SELECT *
FROM (
    SELECT *, RANK() OVER (ORDER BY Price ASC) AS rnk
    FROM orders
) ranked
WHERE rnk = 1;

找出每組的最小值記錄

找出每位顧客的最低金額訂單:

-- 方法 1:使用相關子查詢
SELECT *
FROM orders o1
WHERE Price = (
    SELECT MIN(Price)
    FROM orders o2
    WHERE o2.Customer = o1.Customer
);

-- 方法 2:使用窗口函數
SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Price ASC) AS rn
    FROM orders
) ranked
WHERE rn = 1;

MIN() 與 NULL 值

MIN() 會忽略 NULL 值:

-- 假設有些 Price 為 NULL
SELECT MIN(Price) FROM orders;
-- 只考慮非 NULL 的值

如果所有值都是 NULL,MIN() 返回 NULL。

MIN() 搭配 HAVING

SELECT Customer, MIN(Price) AS MinPrice
FROM orders
GROUP BY Customer
HAVING MIN(Price) < 1000;

結果:

CustomerMinPrice
李三500

MIN() 與窗口函數

計算全域最小值或分組最小值,同時保留原始記錄:

SELECT
    O_Id,
    Customer,
    Price,
    MIN(Price) OVER () AS OverallMin,
    MIN(Price) OVER (PARTITION BY Customer) AS CustomerMin
FROM orders;

結果:

O_IdCustomerPriceOverallMinCustomerMin
1張一10005001000
4張一13005001000
2王二20005001800
5王二18005001800
3李三500500500

MIN() 與 MAX() 搭配使用

同時取得最小值和最大值:

SELECT
    MIN(Price) AS MinPrice,
    MAX(Price) AS MaxPrice,
    MAX(Price) - MIN(Price) AS PriceRange
FROM orders;

結果:

MinPriceMaxPricePriceRange
50020001500

相關主題