在关系型数据库里,当我们无法确定字段的完整值时,就需要借助LIKE操作符完成模糊匹配。它允许在WHERE条件中按照特定模式搜索文本,是处理字符串查询最直观的手段之一。掌握通配符的含义与书写位置,是写出正确且高效SQL的前提。

一、LIKE操作符的基本语法
LIKE操作符通常出现在SELECT语句的WHERE子句中,用来判断某列的值是否符合给定的模式。模式由普通字符和通配符共同组成,数据库引擎会逐行比对,返回满足条件的记录。最基本的写法是将列名、LIKE关键字与带引号的字符串模式放在一起。
下面的示例从用户表中找出所有姓张的人。其中百分号表示后面可以有任意字符,因此“张%”能够匹配张三、张无忌、张伟等任意以张开头的姓名。这种写法在日常查询中最为常见,也最容易理解。
SELECT id, name FROM users WHERE name LIKE '张%';
除了百分号,下划线通配符用来精确匹配单个字符。比如模式“张_”只能匹配姓张且名为一个字的人,像张三是符合的,但张小三就不符合。灵活组合这两种通配符,可以表达非常细致的匹配规则。
二、常用通配符与匹配规则
标准SQL定义了几种核心通配符,不同数据库在细节上略有扩展,但主体逻辑一致。理解它们的差异,能帮我们避免写出预期之外的结果。最典型的就是百分号与下划线的分工,以及如何使用方括号限定字符集合。
| 通配符 | 含义 | 示例 |
|---|---|---|
| % | 匹配零个或多个任意字符 | LIKE 'a%' 匹配以a开头的所有串 |
| _ | 匹配恰好一个任意字符 | LIKE 'a_' 匹配ab、ac但不匹配a |
| [ ] | 匹配括号内任意一个字符(部分库支持) | LIKE '[abc]%' 匹配a、b或c开头 |
在MySQL中,方括号语法并不直接支持,通常需要用正则表达式REGEXP替代;而在SQL Server里,方括号是原生支持的。如果模式里本身包含百分号或下划线,就要定义转义字符,告诉数据库哪个符号是普通字符。以下代码把反斜杠设为转义符,查出包含下划线的产品编码。
SELECT code FROM products WHERE code LIKE '%_%' ESCAPE '';
三、大小写敏感与性能注意点
LIKE匹配是否区分大小写,取决于数据库排序规则。例如MySQL的utf8_general_ci不区分大小写,而PostgreSQL默认区分。当业务要求忽略大小写搜索时,可以统一使用LOWER函数转换后再比较,但这样可能让索引失效,需要权衡。
性能方面,如果模糊模式以百分号开头,如“%值%”,大多数数据库的B+树索引都无法生效,只能全表扫描。数据量大时响应会明显变慢。此时可考虑全文索引或外部搜索引擎。下面演示用LOWER做不区分大小写查询的写法,同时说明其代价。
-- 不区分大小写查找邮箱包含example的用户的写法 SELECT id, email FROM users WHERE LOWER(email) LIKE '%ipipp.com%'; -- 注意:对列使用函数会导致该列索引不可用
如果模式是后半段模糊,如“值%”,则有可能命中最左前缀索引,查询效率较高。设计表结构和查询时,应尽量把确定前缀放在模式开头,把不确定部分放在末尾,从而兼顾灵活性与速度。
四、实际场景中的组合用法
模糊查询常和动态条件拼接一起出现。比如在后台搜索框中,用户输入关键词就拼成LIKE '%关键词%'。为防止空关键词导致全量返回,程序层要先判断再组装SQL,或者使用更安全的参数化查询,避免注入风险。
下面用存储过程风格展示一个带参数的模糊查询示例,通过传入姓名片段返回匹配用户。参数化不仅能防注入,也方便数据库缓存执行计划。实际项目中,建议结合ORM框架提供的模糊查询接口来减少手写拼接错误。
-- 假设使用预编译参数 :name_part
SELECT id, name, phone
FROM users
WHERE name LIKE CONCAT('%', :name_part, '%')
AND status = 1;
在日志分析场景中,LIKE也能快速过滤异常行。比如找出所有含“timeout”的日志消息。虽然不如专业日志系统强大,但在小型系统排障时非常实用。掌握这些用法后,LIKE就能成为你操作数据库时顺手的基础工具。