首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 特殊比較運算子進階應用:BETWEEN、GREATEST/LEAST、IN/NOT IN 實戰

     編輯:MySQL 資料庫相關知識

除了基本的 =、!=、>、<、LIKE,MySQL 提供多種進階比較運算子,能更優雅地處理範圍、極值、集合判斷等場景。

BETWEEN ... AND ...:範圍判斷

包含邊界值,適用數值、日期、字串:

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';

GREATEST() / LEAST():多值極值

回傳參數列表中的最大/最小值,支援數值、日期、字串:

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;

IN / NOT IN:集合成員資格

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 回傳 1SELECT ISNULL(NULL); -- 1
IFNULL(a,b)a 非 NULL 回傳 a,否則 bSELECT IFNULL(NULL, '預設'); -- '預設'
COALESCE(a,b,c...)回傳第一個非 NULLSELECT COALESCE(NULL, NULL, 'c'); -- 'c'
NULLIF(a,b)a=b 回傳 NULL,否則 aSELECT NULLIF(5,5); -- NULL
STRCMP(a,b)字串比較:0=相等,-1=a<b,1=a>bSELECT 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 或 JOIN
  • GREATEST/LEAST 無法使用索引,需在應用層或生成欄位預計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved