BETWEEN AND 表示闭区间查询,等价于 >= 且 = 10 AND price

WHERE子句中BETWEEN AND的基本写法
BETWEEN AND 是 SQL 中用于闭区间范围查询的简洁语法,等价于 >= 且 的组合。它只适用于单列、同类型、可比较的数据,比如数字、日期或字符串。
常见错误是误以为它支持非连续值或跨列判断——比如 WHERE id BETWEEN 1, 10(逗号错用)或 WHERE (a, b) BETWEEN (1,2) AND (5,6)(多列不支持),这些都会报语法错误或逻辑错误。
- 正确写法:
WHERE price BETWEEN 10 AND 100→ 包含 10 和 100 - 等价写法:
WHERE price >= 10 AND price - 字符串也适用:
WHERE name BETWEEN 'Alice' AND 'David'(按字典序,注意大小写敏感性) - 日期同样有效:
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
BETWEEN AND在日期范围查询中的陷阱
日期类型最容易踩坑:如果字段是 DATETIME 或 TIMESTAMP,而你只传入日期字符串(如 '2024-06-01'),数据库可能默认补为 '2024-06-01 00:00:00',导致当天 00:00:01 之后的数据被漏掉。
- 安全做法:显式指定时间边界,例如
WHERE created_at BETWEEN '2024-06-01 00:00:00' AND '2024-06-01 23:59:59' - 更推荐用左闭右开:
WHERE created_at >= '2024-06-01' AND created_at ,避免秒级截断问题 - PostgreSQL / MySQL 8.0+ 支持
DATE(created_at)转换,但会丢失索引能力,慎用
NULL值和数据类型不匹配导致查询失效
BETWEEN AND 对 NULL 值完全不敏感——只要任意一端为 NULL(比如 col BETWEEN NULL AND 100),整个表达式返回 UNKNOWN,该行不会被选中。这和 IN 或 = 的 NULL 行为一致,但容易被忽略。
- 检查字段是否允许
NULL:SELECT COUNT(*) FROM t WHERE col IS NULL - 若需包含空值,必须显式写出:
WHERE (col BETWEEN 10 AND 100) OR col IS NULL - 类型隐式转换风险:比如
status VARCHAR(10)存了'1','10','2',那么status BETWEEN '1' AND '2'会命中'1'和'2',但不会命中'10'(字符串比较)
性能与索引使用注意事项
大多数主流数据库(MySQL、PostgreSQL、SQL Server)对 BETWEEN AND 能正常走 B-tree 索引,前提是列上建有索引且没有函数包裹(如 UPPER(col) BETWEEN ... 就无法用索引)。
- 复合索引下,只有当
BETWEEN字段是索引最左前缀时才生效,例如索引为(category, price),则WHERE category = 'book' AND price BETWEEN 20 AND 50可用索引;但仅price BETWEEN ...则不行 - 范围越窄,索引效率越高;全表扫描常发生在范围过大(如
id BETWEEN 1 AND 1000000占表 80%)时,优化器可能主动放弃索引 - MySQL 中
EXPLAIN显示type为range表示走了索引范围扫描
真正麻烦的不是语法本身,而是边界语义(尤其时间)、NULL 处理和索引是否真被用上——这三处一错,查不到数据还很难定位。











