BETWEEN是语法糖,等价于>= AND

BETWEEN 本质是语法糖,等价于 >= AND
WHERE column BETWEEN value1 AND value2 的真实含义
BETWEEN 构造的是闭区间 [value1, value2],包含两端。它不是“介于中间”的模糊描述,而是严格数学意义上的范围判断。
- 如果
value1 > value2(比如age BETWEEN 60 AND 18),多数数据库(MySQL、PostgreSQL、SQL Server)会返回空结果集,不报错但逻辑失效 - 字符串比较按字典序进行,
name BETWEEN 'A' AND 'H'匹配'Apple'、'Hello',但不匹配'Zebra'或'a'(注意大小写敏感性) - 日期类型要小心时间组件:
created_at BETWEEN '2026-04-01' AND '2026-04-05'实际等价于created_at >= '2026-04-01 00:00:00' AND created_at ,会漏掉 4 月 5 日全天的数据
子查询不能直接用在 BETWEEN 左右边界
像 amount BETWEEN (SELECT MIN(amount) FROM sales) AND (SELECT MAX(amount) FROM sales) 这种写法,在 MySQL 8.0+ 和 PostgreSQL 中可能允许,但在 SQL Server、旧版 MySQL 中会报错或行为不可靠。
- 真正安全通用的写法是拆成两个标量子查询:
amount >= (SELECT MIN(amount) FROM sales) AND amount - 每个子查询必须确保只返回**一行一列**,否则触发
Subquery returns more than 1 row错误 - 若需动态范围(如“高于部门平均值 10% 且低于 110%”),必须用两次独立子查询,不能依赖 BETWEEN 的“单次调用”假象
NOT BETWEEN 容易被忽略的 NULL 行为
column NOT BETWEEN a AND b 并不等价于 NOT (column BETWEEN a AND b) 在所有情况下——当 column 为 NULL 时,整个表达式结果为 NULL,而 WHERE 子句会过滤掉 NULL 行。
- 这意味着
NOT BETWEEN不会返回column IS NULL的记录,哪怕你主观上认为“空值当然不在范围内” - 如需显式包含 NULL,得额外写:
column NOT BETWEEN a AND b OR column IS NULL - 同理,
BETWEEN对NULL值也返回NULL,所以NULL永远不会被BETWEEN匹配到
最常被绕过的点是日期边界的时间精度和子查询的标量约束——它们不报错,但悄悄让查询结果变少或变空。










