mysql的between是闭区间,包含边界值;要求左边界≤右边界,否则条件恒假;日期需防隐式补零,字符串和数值类型须避免隐式转换,否则导致漏查或全表扫描。

MySQL 的 BETWEEN 是闭区间查询,包含边界值;写错顺序或混用字符串/时间类型时容易查不到数据,不是语法错了,而是逻辑没对上。
为什么 BETWEEN a AND b 要求 a ≤ b?
MySQL 会把 BETWEEN 当作 col >= a AND col 展开。如果写成 <code>BETWEEN 10 AND 5,实际等价于 col >= 10 AND col —— 永远为假,结果为空。
- 数值类型必须确保左边界 ≤ 右边界,否则查不到任何行
- 日期/时间也一样:
created_at BETWEEN '2024-06-01' AND '2024-05-01'同样无效 - 字符串按字典序比较,
'b' BETWEEN 'c' AND 'a'也不成立
BETWEEN 在日期查询中要注意时分秒
常见陷阱是用日期字符串查 DATETIME 字段却忽略时间部分。比如 updated_at BETWEEN '2024-05-01' AND '2024-05-31' 实际查的是 '2024-05-01 00:00:00' 到 '2024-05-31 00:00:00',丢掉 5 月 31 日全天的数据。
- 安全写法:用
DATE()提取日期再比,或手动补全时间边界 - 推荐:
updated_at >= '2024-05-01' AND updated_at (更清晰、可走索引) - 若坚持用
BETWEEN,写成updated_at BETWEEN '2024-05-01 00:00:00' AND '2024-05-31 23:59:59'
和 IN、>= / 的性能与可读性对比
BETWEEN 本质是语法糖,优化器通常会转成两个比较操作,所以和手写 >= AND 性能一致,但语义更紧凑;它不等价于 <code>IN(后者是离散值枚举)。
- 单范围连续查询,
BETWEEN更易读,如:age BETWEEN 18 AND 65 - 多个不连续范围,别硬套
BETWEEN,改用OR或IN配合子查询 -
BETWEEN对NULL值无效:若字段含NULL,col BETWEEN 1 AND 10不会命中该行(因为NULL >= 1为UNKNOWN)
真正容易被忽略的是隐式类型转换——比如对字符串字段用数字查:status BETWEEN 0 AND 1,而 status 是 VARCHAR,MySQL 可能全表扫描或结果错乱。务必保持类型一致。











