MIN() 函數 (SQL MIN() Function)
MIN() 是一個聚合函數 (Aggregate Function),用於取得指定欄位中的最小值。它可以用於數值、字串和日期類型的欄位,會忽略 NULL 值。
MIN() 語法 (Syntax)
SELECT MIN(column_name) FROM table_name [WHERE condition];
MIN() 用法範例 (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 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;
結果:
| Customer | MinPrice |
|---|---|
| 張一 | 1000 |
| 王二 | 1800 |
| 李三 | 500 |
MIN() 用於字串
對於字串欄位,MIN() 會返回按字母順序排列的第一個值:
products 資料表:
| P_Id | Name |
|---|---|
| 1 | Apple |
| 2 | Banana |
| 3 | Cherry |
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;
結果:
| Customer | MinPrice |
|---|---|
| 李三 | 500 |
MIN() 與窗口函數
計算全域最小值或分組最小值,同時保留原始記錄:
SELECT
O_Id,
Customer,
Price,
MIN(Price) OVER () AS OverallMin,
MIN(Price) OVER (PARTITION BY Customer) AS CustomerMin
FROM orders;
結果:
| O_Id | Customer | Price | OverallMin | CustomerMin |
|---|---|---|---|---|
| 1 | 張一 | 1000 | 500 | 1000 |
| 4 | 張一 | 1300 | 500 | 1000 |
| 2 | 王二 | 2000 | 500 | 1800 |
| 5 | 王二 | 1800 | 500 | 1800 |
| 3 | 李三 | 500 | 500 | 500 |
MIN() 與 MAX() 搭配使用
同時取得最小值和最大值:
SELECT
MIN(Price) AS MinPrice,
MAX(Price) AS MaxPrice,
MAX(Price) - MIN(Price) AS PriceRange
FROM orders;
結果:
| MinPrice | MaxPrice | PriceRange |
|---|---|---|
| 500 | 2000 | 1500 |