从一个日常场景说起
你在一家电商公司做运营,老板让你查一下最近有没有叫“小李”或者“李强”的客户下单。你打开后台系统,发现用户表里名字五花八门:有叫李晓强的、李志强的、小李子的……精确匹配根本不管用。
这时候,就得靠 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 模糊查询就能成为你处理数据的趁手工具。