SQL 查询数据:用通配符进行过滤

在日常的数据库查询中,我们经常需要根据模糊条件筛选数据(比如 “地址包含某城市”、“手机号以某数字开头”),而通配符就能满足这种需求。本文将详细介绍LIKE操作符与各类通配符的使用方法,以及高效使用通配符的技巧。

  

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实现,匹配指定范围的单个字符;

掌握通配符的使用技巧,能大幅提升日常数据筛选的效率,尤其在处理地址、手机号、姓名等模糊匹配场景时,效果显著。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号