在日常的数据库查询中,我们经常需要根据模糊条件筛选数据(比如 “地址包含某城市”、“手机号以某数字开头”),而通配符就能满足这种需求。本文将详细介绍LIKE操作符与各类通配符的使用方法,以及高效使用通配符的技巧。
LIKE是 SQL 中专门用于模糊匹配的操作符,它必须搭配通配符使用,不能单独存在。语法如下:
SELECT 列名 FROM 表名 WHERE 字段名 LIKE '匹配模式';
其中,“匹配模式” 由 “普通字符 + 通配符” 组成,用于定义模糊匹配的规则。
例如:查询用户地址(address)以 “重庆” 开头的用户信息
> select * from user where address like '重庆%' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+-----------------+-------------+-------------------+-------------------+ 7|吴九 | | 32|13800138006|wujiu@example.com|重庆市渝中区解放碑路18号|2025-01-20 15:40:00|2025-12-24 03:15:28| 1 row(s) fetched.
关于通配符后续将逐一介绍。
百分号(%)是最常用的通配符,可匹配 “任意数量的任意字符”,支持放在匹配模式的开头、中间、结尾。
示例 1:查询地址以 “北京市” 开头的用户
> SELECT * FROM `user` WHERE address LIKE '北京市%' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+--------------------+------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com|北京市朝阳区建国路88号|2025-01-17 00:50:00|2025-12-24 03:15:28| 1 row(s) fetched.
示例 2:查询地址包含 “路” 的用户
> SELECT * FROM `user` WHERE address LIKE '%路%' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+---------------------+--------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com |北京市朝阳区建国路88号 |2025-01-17 00:50:00|2025-12-24 03:15:28| 2|李四 |女 | 30|13800138001|lisi@example.com |上海市浦东新区张江路100号|2025-01-30 05:47:00|2025-12-24 03:15:28| 3|王五 |男 | 28|13800138002|wangwu@example.com |广州市天河区天河路385号 |2025-01-09 02:26:00|2025-12-24 03:15:28| 5|孙七 |男 | 35|13800138004| |杭州市西湖区西湖路58号 |2025-01-10 14:36:00|2025-12-24 03:15:28| 7|吴九 | | 32|13800138006|wujiu@example.com |重庆市渝中区解放碑路18号 |2025-01-20 15:40:00|2025-12-24 03:15:28| 8|郑十 |女 | 29|13800138007|zhengshi@example.com |武汉市武昌区中南路99号 |2025-01-10 04:15:00|2025-12-24 03:15:28| 9|钱十一 |男 | 24|13800138008|qianshiyi@example.com|西安市雁塔区雁塔路15号 |2025-01-17 22:15:00|2025-12-24 03:15:28| 10|孙十二 |女 | 31|13800138009| |南京市玄武区玄武湖路78号 |2025-01-28 02:32:00|2025-12-24 03:15:28| 8 row(s) fetched.
下划线(_)通配符仅匹配一个且仅一个任意字符,不能多也不能少。
示例 :查询地址 “路” 和 “号” 字中间有两位字符的用户信息。
-- 注意:“路” 和 “号” 之间有两个 “_”,因此匹配两个字符 > SELECT * FROM user WHERE address LIKE '%路__号' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+---------------------+-------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com |北京市朝阳区建国路88号 |2025-01-17 00:50:00|2025-12-24 03:15:28| 5|孙七 |男 | 35|13800138004| |杭州市西湖区西湖路58号 |2025-01-10 14:36:00|2025-12-24 03:15:28| 7|吴九 | | 32|13800138006|wujiu@example.com |重庆市渝中区解放碑路18号|2025-01-20 15:40:00|2025-12-24 03:15:28| 8|郑十 |女 | 29|13800138007|zhengshi@example.com |武汉市武昌区中南路99号 |2025-01-10 04:15:00|2025-12-24 03:15:28| 9|钱十一 |男 | 24|13800138008|qianshiyi@example.com|西安市雁塔区雁塔路15号 |2025-01-17 22:15:00|2025-12-24 03:15:28| 10|孙十二 |女 | 31|13800138009| |南京市玄武区玄武湖路78号|2025-01-28 02:32:00|2025-12-24 03:15:28| 6 row(s) fetched.
方括号([])用来匹配指定范围内的单个字符。
注意:MySQL 本身不原生支持[]通配符(这是 SQL Server 的语法),但可通过REGEXP正则表达式实现等效功能,核心是匹配 “指定集合中的单个字符”。
示例1:查询手机号最后一位是 0、1、2 的用户
-- 等效[]的正则写法:最后一位匹配0/1/2中的一个 > SELECT * FROM user WHERE phone REGEXP '1380013800[012]' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+--------------------+--------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com|北京市朝阳区建国路88号 |2025-01-17 00:50:00|2025-12-24 03:15:28| 2|李四 |女 | 30|13800138001|lisi@example.com |上海市浦东新区张江路100号|2025-01-30 05:47:00|2025-12-24 03:15:28| 3|王五 |男 | 28|13800138002|wangwu@example.com |广州市天河区天河路385号 |2025-01-09 02:26:00|2025-12-24 03:15:28| 3 row(s) fetched.
示例2:查询年龄的十位数字是 2 的用户(即 20-29 岁)
> SELECT * FROM user WHERE age REGEXP '^2[0-9]$' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+---------------------+---------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com |北京市朝阳区建国路88号 |2025-01-17 00:50:00|2025-12-24 03:15:28| 3|王五 |男 | 28|13800138002|wangwu@example.com |广州市天河区天河路385号 |2025-01-09 02:26:00|2025-12-24 03:15:28| 4|赵六 |女 | 22|13800138003|zhaoliu@example.com |深圳市南山区科技园10号 |2025-01-13 18:46:00|2025-12-24 03:15:28| 6|周八 |女 | 27|13800138005|zhouba@example.com |成都市武侯区武侯祠大街231号|2025-01-10 16:41:00|2025-12-24 03:15:28| 8|郑十 |女 | 29|13800138007|zhengshi@example.com |武汉市武昌区中南路99号 |2025-01-10 04:15:00|2025-12-24 03:15:28| 9|钱十一 |男 | 24|13800138008|qianshiyi@example.com|西安市雁塔区雁塔路15号 |2025-01-17 22:15:00|2025-12-24 03:15:28| 6 row(s) fetched.
LIKE '%xxx' 会导致数据库无法使用索引,只能全表扫描,数据量大时查询效率极低。
推荐写法(利用前缀匹配,可走索引):
-- 地址以“上海市”开头(前缀匹配) SELECT * FROM `user` WHERE address LIKE '上海市%';
不推荐写法(前缀通配符,全表扫描):
SELECT * FROM `user` WHERE address LIKE '%浦东新区%';
能用 _ 就不用 %,_ 仅匹配单个字符,精度更高,且查询效率略优于 %。
例如:匹配 11 位手机号,确认前 10 位固定,仅最后一位可变时,用 1380013800_ 比 13800138% 更精准。
通配符查询前,先用 AND/OR 过滤掉无关数据,减少匹配量。示例:查询 20-29 岁且地址包含 “区” 的用户:
SELECT * FROM `user` WHERE age BETWEEN 20 AND 29 AND address LIKE '%区%';
如果要匹配的字符本身包含 % 或 _(比如地址是 “XX 路 88% 号”),需要用转义符 \ 进行转义:
-- 匹配地址中包含“88%”的用户(假设存在) > SELECT * FROM `user` WHERE address LIKE '%88\%号%' user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+--------------------+-------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com|北京市朝阳区建国路88%号|2025-01-17 00:50:00|2025-12-26 11:12:52| 1 row(s) fetched.
通配符是模糊查询的利器,核心用法总结:
%:匹配任意长度字符(0 个及以上);
_:匹配单个任意字符;
[]:MySQL 中用REGEXP实现,匹配指定范围的单个字符;
掌握通配符的使用技巧,能大幅提升日常数据筛选的效率,尤其在处理地址、手机号、姓名等模糊匹配场景时,效果显著。