知用网
霓虹主题四 · 更硬核的阅读氛围

SQL模糊查询:让数据查找更灵活实用

发布时间:2025-12-11 11:07:32 阅读:159 次

从一个日常场景说起

你在一家电商公司做运营,老板让你查一下最近有没有叫“小李”或者“李强”的客户下单。你打开后台系统,发现用户表里名字五花八门:有叫李晓强的、李志强的、小李子的……精确匹配根本不管用。

这时候,就得靠 SQL 模糊查询了。它不像等号(=)那样死板,而是像搜索引擎一样,支持“包含”“开头是”“结尾是”这类灵活条件,帮你从海量数据里捞出想要的信息。

LIKE 是模糊查询的核心

在 SQL 中,实现模糊查询主要靠 LIKE 操作符,配合两个通配符:

  • %:代表任意数量的字符(包括零个)
  • _:代表单个字符

比如,想找所有姓“李”的用户:

SELECT * FROM users WHERE name LIKE '李%';

这条语句会匹配“李明”“李晓峰”“李”,甚至“李123”。

如果只想找名字两个字、且姓李的:

SELECT * FROM users WHERE name LIKE '李_';

这里下划线 _ 表示第二个字可以是任意一个字符,所以“李明”“李强”能查到,但“李晓明”就不行。

实际应用中的常见模式

除了“以什么开头”,还有几种常用写法:

查找名字中包含“小”的用户:

SELECT * FROM users WHERE name LIKE '%小%';

这能找出“小李”“张小花”“王小虎”等。

查找以“老师”结尾的名字:

SELECT * FROM users WHERE name LIKE '%老师';

比如“张老师”“刘老师”都能命中。

结合其他条件使用更强大

模糊查询经常和其他条件搭配。比如你要找注册时间在 2023 年之后、并且邮箱是 QQ 的用户:

SELECT * FROM users WHERE email LIKE '%@qq.com' AND created_at > '2023-01-01';

这样既能模糊匹配邮箱域名,又能精确控制时间范围。

注意大小写和性能问题

有些数据库(如 MySQL 在默认配置下)对 LIKE 不区分大小写,但 PostgreSQL 就可能区分。如果需要明确控制,可以用 ILIKE(PostgreSQL 支持)或配合 UPPER() 函数处理。

另外,模糊查询尤其是前导 %(比如 %abc)会导致索引失效,数据量大时会变慢。如果追求性能,尽量用“前缀匹配”(如 abc%),并给对应字段加索引。

正则表达式?也可以,但别滥用

某些数据库(如 PostgreSQL、MySQL 8.0+)支持更强大的正则匹配,比如用 ~REGEXP

SELECT * FROM users WHERE name ~ '^李.*强$';

这条语句找的是以“李”开头、以“强”结尾的名字,比 LIKE 更灵活。但语法复杂,调试麻烦,日常使用中,多数情况 LIKE 已经够用。

掌握好 LIKE 和通配符,再结合业务场景稍作变形,SQL 模糊查询就能成为你处理数据的趁手工具。