SQL BETWEEN:包含边界的数字与日期范围

SQL BETWEEN 用于筛选列值落在指定范围内的行,并且包含两个端点。它把一对 >=<= 条件合并为一个谓词,在需要包含边界的范围查询中能让 WHERE 子句更紧凑。BETWEEN 可用于数字、日期和文本,但日期范围在包含时间部分时需要额外注意。

SQL BETWEEN 范围筛选示例

输出:

输出将显示在这里...

输出:

+----------+-------+------------+
| customer | total | placed     |
+----------+-------+------------+
| 博文     | 120.5 | 2026-02-15 |
| 佳拉     | 89.99 | 2026-02-20 |
+----------+-------+------------+
2 row(s)

这个示例如何工作

  1. CREATE TABLEINSERT 建立了一个 orders 表,包含四条总金额与日期不同的记录。
  2. WHERE total BETWEEN 50 AND 150 只保留 total >= 50 AND total <= 150 的行。两个边界都包含在内,所以金额恰好是 50 或 150 的行也会命中。
  3. 金额为 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)才能覆盖整天。