BETWEEN 在 SQL 中表示闭区间比较且左右边界顺序不可颠倒,value BETWEEN 100 AND 50 恒为 false;等价于 column >= low AND column <= high。

BETWEEN 在 SQL 中查数值范围,本质是闭区间比较,等价于 column >= low AND column ,但写法更简洁、可读性更高——前提是注意边界值和数据类型匹配。
为什么 BETWEEN 查询有时“漏掉”最大值?
常见原因是字段类型与边界值类型不一致,导致隐式转换出错。比如 price 是 DECIMAL(10,2),但写成 BETWEEN 10 AND 20.000,某些数据库(如旧版 MySQL)可能截断或舍入 20.000 成 20.00,而实际存储值是 20.005,就查不到。
- 始终让边界值的精度/小数位数与字段定义一致:若
price是DECIMAL(10,2),就用10.00和20.00 - 避免混用整数和浮点字面量:
BETWEEN 10.0 AND 20.0比BETWEEN 10 AND 20.0更安全 - 对
TIMESTAMP或DATETIME字段,BETWEEN '2023-01-01' AND '2023-01-31'实际包含到当天的00:00:00,不是全天;要查整月得用'2023-01-31 23:59:59'或更好方式(见下条)
BETWEEN 和 >= /
没有本质区别。主流数据库(PostgreSQL、SQL Server、MySQL 8.0+)都会把 BETWEEN a AND b 重写为 col >= a AND col 再优化,执行计划完全一样。索引能否生效,只取决于字段是否在索引中、是否被函数包裹、以及边界值是否可评估。
- 确保列上有索引,且没被表达式干扰:✅
WHERE amount BETWEEN 100 AND 500可走索引;❌WHERE CAST(amount AS INT) BETWEEN 100 AND 500通常无法用索引 - 如果查询时间范围,优先用开区间避开
BETWEEN的时间陷阱:created_at >= '2023-01-01' AND created_at 更精确、更易复用、也避免时区或微秒精度问题
字符串字段用 BETWEEN 要特别当心什么?
字符串的 BETWEEN 按字典序比较,不是按长度或语义。例如 name BETWEEN 'A' AND 'Z' 会命中 'Apple',但不会命中 'aardvark'(小写 a 在 ASCII 中比大写 Z 靠后),还可能意外包含 'ZZZ' 这类超长前缀值。
- 确认排序规则(collation):大小写敏感与否直接影响结果,
utf8mb4_0900_as_cs和utf8mb4_general_ci行为不同 - 避免用
BETWEEN做模糊前缀匹配:想查 A–F 开头的名字,不如用name >= 'A' AND name ,逻辑更可控 - 数字型字符串(如
'001','010','100')用BETWEEN '001' AND '100'会返回'010',但不会返回'2'(因为'2' > '100'字典序成立),这种陷阱极易被忽略
真正容易被忽略的是:BETWEEN 的左右边界顺序不能颠倒——value BETWEEN 100 AND 50 在所有标准 SQL 中都恒为 false,不会自动交换。写之前多扫一眼 low 和 high 值,比调半天才发现查不到数据更省时间。

















