除了基本的 =、!=、>、<、LIKE,MySQL 提供多種進階比較運算子,能更優雅地處理範圍、極值、集合判斷等場景。
包含邊界值,適用數值、日期、字串:
SELECT 2350 BETWEEN 100 AND 10000; -- 1 (真)
SELECT '2006-04-05' BETWEEN '2006-01-01' AND '2007-01-01'; -- 1
SELECT '2006-04-05' BETWEEN '2006-01-01' AND '2006-04-01'; -- 0 (假)
實戰:薪資區間、日期範圍、分頁游標:
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
SELECT * FROM orders WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';
回傳參數列表中的最大/最小值,支援數值、日期、字串:
SELECT GREATEST(20000601, 20000529, 20000604); -- 20000604
SELECT LEAST(100, 200, 50, -6, -73, 1000); -- -73
實戰:多欄位取最新/最舊時間、多價格取最低:
-- 取三個時間欄位中最新的
SELECT GREATEST(created_at, updated_at, published_at) AS latest FROM articles;
-- 取多供應商報價最低價
SELECT LEAST(supplier_a_price, supplier_b_price, supplier_c_price) AS min_price FROM products;
SELECT * FROM users WHERE status IN (1, 2, 3); -- 狀態為 1/2/3
SELECT * FROM users WHERE status NOT IN (0, -1); -- 排除停用/刪除
子查詢搭配:
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE vip_level > 2);
⚠️ 注意:NOT IN 子查詢若包含 NULL,整個結果為空集。改用 NOT EXISTS 或 LEFT JOIN ... IS NULL。
| 函數/運算子 | 用途 | 範例 |
|---|---|---|
ISNULL(expr) | expr 為 NULL 回傳 1 | SELECT ISNULL(NULL); -- 1 |
IFNULL(a,b) | a 非 NULL 回傳 a,否則 b | SELECT IFNULL(NULL, '預設'); -- '預設' |
COALESCE(a,b,c...) | 回傳第一個非 NULL | SELECT COALESCE(NULL, NULL, 'c'); -- 'c' |
NULLIF(a,b) | a=b 回傳 NULL,否則 a | SELECT NULLIF(5,5); -- NULL |
STRCMP(a,b) | 字串比較:0=相等,-1=a<b,1=a>b | SELECT STRCMP('a','b'); -- -1 |
INTERVAL(N,N1,N2...) | 回傳 N 在排序列表中的位置 | SELECT INTERVAL(5, 1,3,5,7); -- 2 |
BETWEEN 可使用索引範圍掃描IN (常數列表) 優化器會轉為二分搜尋,極快IN (子查詢) MySQL 5.6+ 優化為 Semi-Join,舊版建議改 EXISTS 或 JOINGREATEST/LEAST 無法使用索引,需在應用層或生成欄位預計算