电话
400 9058 355
MySQL的BETWEEN是闭区间,等价于col >= a AND col =与
BETWEEN 是闭区间,包含边界值直接说结论:BETWEEN a AND b 等价于 col >= a AND col ,两端都包含。很多人误以为它像某些编程语言的切片那样“左闭右开”,结果漏掉最大值或最小值。
常见错误现象:查 2025-01-01 到 2025-12-31 的订单,写成 date BETWEEN '2025-01-01' AND '2025-12-31',但实际数据含时间(如 '2025-12-31 14:22:05'),这时会漏掉当天所有非零点记录——因为字符串比较时 '2025-12-31 14:22:05' > '2025-12-31'(后者被隐式转为 '2025-12-31 00:00:00')。
BETWEEN '2025-01-01 00:00:00' AND '2025-12-31 23:59:59',或更推荐用 >= 和 组合
BETWEEN 对 NULL 无效:若字段为 NULL,col BETWEEN 1 AND 10 返回 FALSE,不是 NULL;需单独处理 IS NULL
'b' BETWEEN 'a' AND 'c' 成立,但 'B' BETWEEN 'a' AND 'c' 取决于排序规则(如 utf8mb4_0900_as_cs 区分大小写)IN、>= + 的性能与语义差异
BETWEEN 本质是语法糖,优化器通常会转成两个边界条件,所以和手写 col >= a AND col 在执行计划里几乎没区别。但它不能替代 IN——BETWEEN 只能表达连续范围,IN (1,3,5) 是离散值。
BETWEEN 能走范围扫描(type: range),前提是没在字段上套函数,比如 YEAR(created_at) BETWEEN 2025 AND 2025 会强制全表扫描BETWEEN 模拟多值等值查询:id BETWEEN 100 AND 105 和 id IN (100,101,102,103,104,105) 看似一样,但前者依赖连续性,后者更明确且容错性强price BETWEEN 9.99 AND 10.01 可能因精度问题漏掉 10.009999999999999,建议统一转为定点数(DECIMAL)或改用 >=/
NOT BETWEEN 时注意逻辑陷阱NOT BETWEEN a AND b 等价于 col b,不是简单的取反。当字段本身可能为 NULL 时,整个表达式结果为 UNKNOWN,而 WHERE 会过滤掉 UNKNOWN,导致 NULL 行不出现——这点常被忽略。
NULL 当作有效值纳入 NOT BETWEEN 结果,得显式加判断:col NOT BETWEEN 1 AND 10 OR col IS NULL
WHERE status NOT BETWEEN 'active' AND 'pending' AND type = 'user',优先级没问题,但可读性差,建议拆成独立条件或用括号强调NOT BETW
EEN 不如直接列排除值:status NOT IN ('active', 'pending') 更直观且避免边界歧义BETWEEN 的坑)真正安全的日期范围写法往往绕开 BETWEEN,尤其当字段是 DATETIME 或带时区时。核心原则:左闭右开(>= + ),避免时间截断和隐式转换。
created_at >= '2025-01-01' AND created_at ,比 BETWEEN '2025-01-01' AND '2025-01-31 23:59:59' 更可靠
DATE(created_at) = CURDATE() 效率低(无法走索引),应写成 created_at >= CURDATE() AND created_at
边界值处理永远比语法本身更关键——BETWEEN 很简单,但时间精度、字符排序、NULL 传播这些细节,才是线上出问题的地方。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...