mysql如何使用between子句_mysql范围查询语法

发布时间 - 2026-01-31 00:00:00    点击率:
MySQL的BETWEEN是闭区间,等价于col >= a AND col =与

MySQL 的 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'
    ,或更推荐用 >= 组合
  • BETWEENNULL 无效:若字段为 NULLcol 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 105id 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 BETWEEN 不如直接列排除值: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
  • 跨时区场景下,先统一转为 UTC 再比较,避免本地时间偏差影响范围判断

边界值处理永远比语法本身更关键——BETWEEN 很简单,但时间精度、字符排序、NULL 传播这些细节,才是线上出问题的地方。


# mysql  # 状态码  # 隐式转换  # NULL  # date  # 有效值  # 隐式  # 才是  # 很多人  # 很简单  # 线上  # 想把  # 但它  # 能为  # 零点 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: iOS发送验证码倒计时应用  nginx修改上传文件大小限制的方法  北京企业网站设计制作公司,北京铁路集团官方网站?  JS去除重复并统计数量的实现方法  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  怎样使用JSON进行数据交换_它有什么限制  如何挑选高效建站主机与优质域名?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何处理异常和错误?(Handler示例)  Laravel如何实现API版本控制_Laravel版本化API设计方案  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  教学论文网站制作软件有哪些,写论文用什么软件 ?  QQ浏览器网页版登录入口 个人中心在线进入  油猴 教程,油猴搜脚本为什么会网页无法显示?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  如何快速重置建站主机并恢复默认配置?  网站建设要注意的标准 促进网站用户好感度!  如何在宝塔面板创建新站点?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何实现模型的全局作用域?(Global Scope示例)  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  如何基于云服务器快速搭建网站及云盘系统?  利用vue写todolist单页应用  Android okhttputils现在进度显示实例代码  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何快速启动建站代理加盟业务?  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何快速搭建高效香港服务器网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel如何自定义分页视图?(Pagination示例)  网站图片在线制作软件,怎么在图片上做链接?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  javascript中的try catch异常捕获机制用法分析  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  如何在阿里云虚拟服务器快速搭建网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  jQuery中的100个技巧汇总  图册素材网站设计制作软件,图册的导出方式有几种?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全