MySQL中BETWEEN AND包含边界值;它是闭区间操作符,等价于col >= low AND col <= high,要求low ≤ high,否则结果为空,日期类型需注意隐式补零导致漏查。

MySQL中BETWEEN AND是否包含边界值?
包含。MySQL的BETWEEN AND是闭区间操作符,等价于col >= low AND col ,左右边界都会被包含在结果集中。
常见错误:混淆BETWEEN AND与开区间写法
有人误以为BETWEEN像某些语言的切片语法(如Python的[start:end])不包含右边界,导致漏查数据。实际在MySQL中:
• WHERE id BETWEEN 1 AND 5 返回 1,2,3,4,5
• 它**不是** id >= 1 AND id
日期类型使用BETWEEN AND时的隐含陷阱
对DATETIME或TIMESTAMP字段直接用BETWEEN '2024-01-01' AND '2024-01-31',MySQL会自动补全为'2024-01-01 00:00:00'和'2024-01-31 00:00:00',导致当天23:59:59的数据被排除。
正确做法是:
- 显式写出时间部分:
BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59' - 或改用更安全的半开区间:
WHERE dt >= '2024-01-01' AND dt - 避免依赖隐式转换,尤其当字段有索引时,隐式补零可能影响索引使用
BETWEEN AND与IN、比较运算符的性能差异
对于连续数值范围查询,BETWEEN语义清晰且优化器通常能高效利用B+树索引;而IN (1,2,3,4,5)只适用于离散值,且值过多时可能退化为全表扫描。
注意:
-
BETWEEN不能用于非有序类型(如JSON、TEXT字段),否则报错或返回意外结果 - 字段为
NULL时,NULL BETWEEN 1 AND 10恒为FALSE,不会匹配 - 字符串比较按字符集排序规则执行,例如
'abc' BETWEEN 'ab' AND 'ad'为TRUE,但'aZ' BETWEEN 'ab' AND 'ad'取决于collation大小写敏感性
日期边界处理最容易被忽略——它看起来像纯语法问题,实则牵扯到隐式类型转换、索引有效性与业务语义准确性。


















