首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL BETWEEN 運算子完全指南:包含邊界、否定邏輯與資料型別陷阱

     編輯:關於SqlServer

語法與核心語意

test_expression [ NOT ] BETWEEN begin_expression AND end_expression
  • 包含邊界:BETWEEN 20 AND 22 等價於 >= 20 AND <= 22。
  • 順序固定:begin_expression 必須 ≤ end_expression,否則永遠不匹配 (不會自動交換)。
  • 資料型別優先權:三運算元會隱含轉換為最高優先權型別 (如 int + datetime → datetime),可能導致隱含轉換導致索引失效。

基本範例

範例 1:查詢年齡 20~22 歲學生 (含邊界)

SELECT number, age FROM students WHERE age BETWEEN 20 AND 22;

範例 2:查詢年齡不在 20~22 歲學生

SELECT number, age FROM students WHERE age NOT BETWEEN 20 AND 22;
-- 等價於 age < 20 OR age > 22 (注意:若 age 為 NULL,結果為 UNKNOWN,不會被選取)

常見陷阱與最佳實踐

陷阱說明解決方案
日期時間型別上界截斷WHERE dt BETWEEN '2023-01-01' AND '2023-01-31' 會漏掉 1/31 當天 00:00:00 之後的資料 (字串轉 datetime 預設 00:00:00)用 WHERE dt >= '2023-01-01' AND dt < '2023-02-01' (半開區間)
字串比對排序規則影響BETWEEN 'A' AND 'Z' 依資料庫排序規則,可能不包含小寫或重音字元明確指定 COLLATE Latin1_General_CI_AI 或用 LIKE 模式
NULL 值處理任何與 NULL 比較結果為 UNKNOWN,BETWEEN / NOT BETWEEN 皆不會選取 NULL 列若需包含 NULL:WHERE (col BETWEEN 1 AND 10) OR col IS NULL
隱含轉換導致索引掃描WHERE varchar_col BETWEEN 1 AND 100 → 隱含轉換 varchar_col 為 int,索引失效參數/常數型別與欄位一致:BETWEEN '1' AND '100'
NOT BETWEEN 邏輯誤解以為 NOT BETWEEN 等於 NOT (BETWEEN),但三值邏輯下 NULL 會導致不同結果明確寫成 WHERE col < 1 OR col > 10 OR col IS NULL (視業務需求)

效能考量

  • BETWEEN 可利用索引 Seek (SARGable),前提是無隱含轉換、無函數包裹欄位。
  • 複合索引中,BETWEEN 欄位若非前導欄位,可能退化為 Scan。
  • 大範圍 BETWEEN (如 > 10% 資料) 優化器可能選擇 Clustered Index Scan,可用 FORCESEEK 提示測試。

跨資料庫平台差異

總結

BETWEEN 簡潔易讀,但日期上界、NULL 語意、隱含轉換是三大雷區。建議:日期範圍一律用半開區間 (>= 且 <);明確處理 NULL;常數與欄位型別對齊。如此既享可讀性,又避免語意陷阱與效能退化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
平台BETWEEN 語意備註
SQL Server包含邊界標準 SQL
Oracle包含邊界同標準
MySQL包含邊界同標準
PostgreSQL包含邊界同標準
Access (Jet/ACE)包含邊界同標準