SQL BETWEEN:包含边界的数字与日期范围
SQL BETWEEN 用于筛选列值落在指定范围内的行,并且包含两个端点。它把一对 >= 与 <= 条件合并为一个谓词,在需要包含边界的范围查询中能让 WHERE 子句更紧凑。BETWEEN 可用于数字、日期和文本,但日期范围在包含时间部分时需要额外注意。
SQL BETWEEN 范围筛选示例
输出:
输出将显示在这里...
输出:
+----------+-------+------------+
| customer | total | placed |
+----------+-------+------------+
| 博文 | 120.5 | 2026-02-15 |
| 佳拉 | 89.99 | 2026-02-20 |
+----------+-------+------------+
2 row(s)
这个示例如何工作
CREATE TABLE和INSERT建立了一个orders表,包含四条总金额与日期不同的记录。WHERE total BETWEEN 50 AND 150只保留total >= 50 AND total <= 150的行。两个边界都包含在内,所以金额恰好是 50 或 150 的行也会命中。- 金额为 45.00 和 200.00 的记录不在范围内,因此会被排除。
x BETWEEN y AND z 等价于 x >= y AND x <= z。如果任一边界是 NULL,该谓词会计算为 unknown,当前行会被过滤掉。
什么是 SQL BETWEEN?
SQL BETWEEN 用于判断一个值是否落在包含边界的区间内:column >= low AND column <= high。在数字范围查询里它可读性好,行为也很直观。有些数据库还支持 BETWEEN SYMMETRIC,在上下界写反时会自动交换。
SQL BETWEEN 的常见错误
错误: 对时间戳范围直接使用 BETWEEN。
错误写法:
WHERE placed BETWEEN '2026-02-01' AND '2026-02-28'
正确写法:
WHERE placed >= '2026-02-01' AND placed < '2026-03-01'
原因:如果列中包含时间,像 '2026-02-28' 这样的结束日期通常只匹配当天的起始时刻。使用左闭右开区间才能覆盖整天。
错误: 上下界写反后仍期待返回结果。
错误写法:
WHERE total BETWEEN 150 AND 50
正确写法:
WHERE total BETWEEN 50 AND 150
原因:普通 BETWEEN 要求第一个边界是较小值。边界反转后,条件通常不可能为真。
BETWEEN、IN 与比较运算符对比
| 写法 | 适用场景 |
|---|---|
BETWEEN low AND high | 范围连续,且上下界都需要包含 |
>= low AND < high | 需要排除上界(时间戳、分页) |
IN (a, b, c) | 值是离散集合,而非连续区间 |
> low AND < high | 上下界都必须排除 |
规则:数字范围且需要包含边界时,优先用 BETWEEN。如果任一边界要排除,尤其是日期时间条件,请改用显式比较。固定枚举值用 IN,BETWEEN 会把中间不需要的值也匹配出来。
性能说明
BETWEEN 是可走索引(sargable)的,查询优化器会把它当作 >= AND <=,因此可以利用筛选列上的 B-tree 索引。把列包在函数里(如 DATE(col)、LOWER(col))会阻止索引使用;应优先规范化边界值。即使用了索引,范围过宽仍会扫描大量行,所以选择性比运算符本身更关键。
常见问题
SQL BETWEEN 是包含边界还是排除边界?
BETWEEN 在两端都是包含的。WHERE x BETWEEN 5 AND 10 会返回 x 为 5、6、7、8、9、10 的行。SQL 没有内置“完全排除边界”的 BETWEEN 变体;要排除边界请使用 > 和 <。
BETWEEN 可以用于文本值吗?
可以。WHERE name BETWEEN 'A' AND 'M' 会在当前排序规则下返回落在该区间内的名称。结果取决于数据库的排序规则与大小写敏感设置,所以在生产环境依赖文本范围前应先按实际配置验证。
为什么 BETWEEN 会漏掉结束日期当天的记录?
当列类型是 datetime(日期加时间)时,像 '2026-02-28' 这样的上界通常会被视作当天 00:00:00。2 月 28 日稍晚时间的记录就会落到范围外。使用左闭右开区间(>= start AND < next_day)才能覆盖整天。