如何在mysql中使用BETWEEN和LIKE条件

来源:Python编程网作者:梧桐头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何在mysql中使用BETWEEN和LIKE条件》,敬请观看详情。写报表查询时,不少人会把范围判断和模糊匹配混在一句WHERE里,结果索引失效、返回行数不对。BETWEEN是闭区间范围筛选,包含两端边界;LIKE依赖通配符做模式匹配,百分号在前会放弃走索引。两者可同时出现在同一查询中,但执行顺序与数据类型直接影响结果。文本演示日期区间加名称模糊搜素的写法,说明转义符与边界处理,帮你写出既准确又高效的SQL。

在MySQL查询中,BETWEEN用于选取某个闭区间内的数据,LIKE则负责按模式进行模糊匹配。把这两个条件组合使用,可以同时满足范围限定与关键字过滤的需求,但要注意数据类型、边界包含以及索引使用情况。

如何在mysql中使用BETWEEN和LIKE条件

一、BETWEEN条件的基础用法

BETWEEN后面跟两个值,表示字段值大于等于第一个值,并且小于等于第二个值。它是一个闭区间,这一点和某些编程语言里的开区间函数不同,初学者经常误以为不包含边界。

下面以订单表为例,查询2023年1月1日到2023年1月31日之间的订单。注意BETWEEN对日期类型同样适用,但需要确保日期格式正确,或者用字符串的字典序比较。如果字段是DATETIME类型,BETWEEN '2023-01-01' AND '2023-01-31'只会取到1月31日零点,不包含当天后续时间。

-- 查询指定日期范围内的订单id和金额
SELECT order_id, amount
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';

如果希望包含1月31日全天,应该把上限写成次日的零点,或者使用大于等于和小于的组合。这种写法在涉及时间字段时更加安全,也能让优化器更清楚地知道范围。

-- 更严谨的日期范围写法
SELECT order_id, amount
FROM orders
WHERE order_date >= '2023-01-01'
  AND order_date < '2023-02-01';

二、LIKE条件与通配符

LIKE用来做字符串的模糊查询,它支持两个主要通配符:百分号%代表任意长度字符,下划线_代表单个字符。例如'张%'匹配所有以张开头的姓名,而'张_'只匹配张后面跟一个字的两字姓名。

当百分号出现在最左侧,如'%手机',MySQL通常无法使用该列上的普通索引,会进行全表扫描。如果业务允许,尽量把确定前缀放在前面,或者考虑全文索引来提升性能。

-- 查找姓名以张开头的用户
SELECT user_id, user_name
FROM users
WHERE user_name LIKE '张%';

-- 查找姓名中包含手机二字的用户
SELECT user_id, user_name
FROM users
WHERE user_name LIKE '%手机%';

有时我们要搜索本身带有百分号或下划线的内容,这时需要用ESCAPE定义转义符。比如商品名里真的有下划线,可以用LIKE 'A_B' ESCAPE ''来精确匹配。

-- 转义下划线,匹配名称为 A_B 的商品
SELECT product_id, product_name
FROM products
WHERE product_name LIKE 'A_B' ESCAPE '';

三、BETWEEN与LIKE同时使用的写法

在同一个WHERE子句中,BETWEEN和LIKE可以通过AND或OR连接。最常见的场景是:先限定时间范围,再在范围内做名称模糊搜索。这种组合不会相互冲突,只是各自独立发挥作用。

以下语句查询2023年第一季度下单、且客户名包含科技二字的所有记录。BETWEEN负责时间闭区间,LIKE负责模糊过滤,两者通过AND同时生效。

-- 时间区间 + 名称模糊匹配
SELECT order_id, customer_name, order_date
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-03-31'
  AND customer_name LIKE '%科技%';

如果想查找不在某区间或不符合模式的记录,可以配合NOT使用。但要注意NOT LIKE和NOT BETWEEN都会让索引使用变得复杂,数据量大时建议先用EXPLAIN分析执行计划。

-- 排除特定区间和特定名称前缀
SELECT order_id, customer_name
FROM orders
WHERE order_date NOT BETWEEN '2023-01-01' AND '2023-03-31'
  AND customer_name NOT LIKE '测试%';

四、数据类型与性能注意点

BETWEEN对数值、日期、字符串都有效,但字符串比较依据字符集和排序规则。例如在区分大小写的校对规则下,'abc' BETWEEN 'AAA' AND 'ABD'的结果和默认规则可能不同。写区间时务必保证两端类型与字段一致,避免隐式转换导致索引失效。

从性能角度看,BETWEEN在索引列上通常能命中range扫描,效率较高;LIKE只有非前导通配符时才能利用索引。如果业务高频使用两者组合,可以考虑在where条件顺序上把能走索引的BETWEEN放在前面,虽然MySQL优化器会重排,但清晰的语句更利于维护。

条件组合索引使用情况适用场景
BETWEEN 索引列走range索引时间、数值范围查询
LIKE '前缀%'走range索引已知开头模糊搜
LIKE '%关键词'全表扫描低频或短表查询
BETWEEN + LIKE AND取决于优化器与列顺序范围加过滤综合查询

实际开发中,建议把这类查询封装成存储过程或持久层方法,并加上EXPLAIN检查。当数据量达到百万级,单纯依赖BETWEEN和LIKE可能不够,需要结合分区表或搜索引擎来分担压力。

五、常见错误与纠正

一个典型错误是把BETWEEN写成column BETWEEN '2023-01-31' AND '2023-01-01',也就是小值放在后面。MySQL不会自动交换顺序,这样会返回空结果。必须保证第一个值小于等于第二个值。

另一个错误是在LIKE里拼接用户输入时不处理转义,导致用户输入下划线匹配了任意单字。应在程序层对用户输入中的%_做转义处理,再拼入SQL,或者使用预编译参数绑定来避免意外通配。

// PHP中对用户输入做LIKE转义示例
$raw = $_GET['kw'];
$escaped = addcslashes($raw, '%_');
$sql = "SELECT * FROM articles WHERE title LIKE '%" . $escaped . "%'";

通过理解闭区间本质、通配符规则以及索引行为,就能在MySQL中稳妥地使用BETWEEN和LIKE条件,写出结果准确且易于优化的查询语句。

mysqlbetweenlike修改时间:2026-08-01 02:03:14

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。