between包含边界值且对null和数据类型敏感,查不到预期数字主因是字段为字符串类型导致字典序比较异常、含null值返回unknown、日期字符串格式不统一引发错误排序。

BETWEEN ... AND 在 SQL 中确实能查指定数值范围,但它默认包含边界值,且对 NULL 和数据类型敏感——用错反而漏数据或报错。
为什么 BETWEEN 查不到预期的数字?
常见现象是:明明表里有 age = 25,但写 WHERE age BETWEEN 25 AND 30 却没返回。原因通常是:
-
age字段实际是字符串类型(如'25'),而字符串比较按字典序,'100'会落在'25'和'30'之间 - 字段含
NULL,BETWEEN对NULL永远返回UNKNOWN,不匹配任何行 - 误把日期字符串当日期用,比如
'2023-1-5'和'2023-10-1'比较时,'2023-10-1'会被认为小于'2023-1-5'(因字符串左对齐)
BETWEEN 和 >= AND 真的等价吗?
逻辑上等价,但执行层面有细微差别:
- 优化器通常将
BETWEEN a AND b重写为col >= a AND col ,所以性能无差异 -
BETWEEN要求左右两个表达式类型兼容,而显式写>=/时数据库可能隐式转换(如 MySQL 把字符串 <code>'10'转成数字),导致行为不一致 - 某些场景下
BETWEEN更易读,比如时间范围:created_at BETWEEN '2024-01-01' AND '2024-12-31';但若需排除右边界(如开区间),必须改用,<code>BETWEEN不支持
日期范围查询最容易踩的坑
用 BETWEEN 查日期时,'2024-01-01' AND '2024-01-31' 看似覆盖整月,但实际只查到 '2024-01-31 00:00:00',漏掉当天其他时间点的数据。
正确做法是:
- 明确字段类型:确认
created_at是DATETIME还是DATE - 统一用左闭右开:例如
created_at >= '2024-01-01' AND created_at - 若坚持用
BETWEEN,且字段是DATE类型(无时间部分),则BETWEEN '2024-01-01' AND '2024-01-31'安全;但一旦字段含时间,就得补上最大时间:BETWEEN '2024-01-01' AND '2024-01-31 23:59:59'(不推荐,精度和时区易出错)
边界值是否包含、NULL 怎么处理、类型是否隐式转换——这些细节在真实业务查询里一不留神就少几万条记录。别只看语法像不像,得盯住执行计划和实际返回结果。










