PostgreSQL LIKE 子句:轻松掌握模糊查询的利器
在日常开发中,我们经常会遇到这样的场景:用户输入一个关键词,比如“张”,希望查出所有姓张的人;或者想搜索包含“邮件”字样的邮箱地址。这时候,精确匹配(=)就显得力不从心了。这时候,PostgreSQL 提供的强大功能——LIKE 子句,就派上用场了。
LIKE 子句是 SQL 中用于模式匹配的重要工具,尤其适用于文本字段的模糊搜索。它让你可以基于特定的模式来筛选数据,而不需要完全匹配整个字符串。它就像一个“智能过滤器”,能帮你从海量数据中快速找出符合条件的记录。
想象一下你在图书馆找书。如果你只知道书名里有“编程”两个字,但不知道全名,直接用“= 编程”肯定找不到。但如果你说“书名里包含‘编程’”,图书馆员就能帮你定位到所有相关书籍。LIKE 子句就相当于这个“智能过滤器”。
LIKE 子句的基本语法与核心符号
LIKE 子句的基本语法非常直观:
SELECT column_name
FROM table_name
WHERE column_name LIKE 'pattern';
其中,pattern 是你要匹配的模式,它支持两个关键通配符:
%:代表任意数量的字符(包括零个字符)_:代表恰好一个字符
举个例子,如果想找出所有名字以“张”开头的人:
SELECT name
FROM users
WHERE name LIKE '张%';
这里,'张%' 表示:以“张”开头,后面可以跟任意数量的字符。所以“张三”“张小明”“张伟”都会被匹配。
再比如,查找名字是三个字且第三个字是“明”的人:
SELECT name
FROM users
WHERE name LIKE '__明';
这里的 __明 表示前两个字符任意,第三个字符必须是“明”。所以“李明”“王明”会被匹配,但“张伟”不会。
💡 小贴士:
%是最常用的通配符,相当于“任意长度的字符串”。而_更精确,用于匹配固定长度的字符。
常见用法场景与实战案例
匹配开头或结尾
当你需要查找以某个字符串开头的数据时,用 % 放在结尾即可。
比如,查找所有以“admin”开头的用户名:
SELECT username
FROM users
WHERE username LIKE 'admin%';
这会返回 admin、admin_user、admin_panel 等所有以“admin”开头的用户名。
反过来,如果想查以“.jpg”结尾的文件名:
SELECT file_name
FROM files
WHERE file_name LIKE '%.jpg';
这能精准筛选出所有图片文件,即使文件名很长也没问题。
模糊中间匹配
有时候我们只记得某个关键词出现在字符串中间。比如,想查所有包含“测试”两个字的订单备注:
SELECT order_id, remark
FROM orders
WHERE remark LIKE '%测试%';
这里的 %测试% 表示:前面任意,中间有“测试”,后面也任意。所以“测试用例”“测试通过”“系统测试”都会被查出来。
✅ 实战建议:在搜索功能中,这种“任意位置包含关键词”的查询非常常见。可以配合前端输入框动态构建
LIKE模式。
大小写敏感性与不区分大小写的写法
PostgreSQL 的 LIKE 默认是区分大小写的。比如:
SELECT name
FROM users
WHERE name LIKE 'zhang%';
这条语句只会匹配“zhang”开头的名字,而“Zhang”“Zhang123”不会被匹配。
如果你希望忽略大小写,可以使用 ILIKE(Insensitive LIKE):
SELECT name
FROM users
WHERE name ILIKE 'zhang%';
ILIKE 会将“zhang”“Zhang”“ZHANG”都视为匹配项。
⚠️ 注意:
ILIKE是 PostgreSQL 特有的语法,不是所有数据库都支持。如果你在 MySQL 或 SQLite 中开发,需要使用UPPER()或LOWER()函数来实现类似效果。
使用 ESCAPE 关键字处理特殊字符
当你的搜索模式中包含 % 或 _ 本身时,它们会被当作通配符,这就可能出错。比如,你想查找文件名中包含 % 字符的记录:
SELECT file_name
FROM files
WHERE file_name LIKE '%\%%';
但这里 % 会被解释为通配符,导致查询失效。
这时就需要用 ESCAPE 关键字来转义特殊字符。例如:
SELECT file_name
FROM files
WHERE file_name LIKE '%\%%' ESCAPE '\';
ESCAPE '\' 告诉数据库:\ 是转义符。所以 \% 就表示字面意义的 %,而不是通配符。
同样,如果想匹配 _,可以写成 \_:
SELECT file_name
FROM files
WHERE file_name LIKE '%\_test%' ESCAPE '\';
这表示查找包含“_test”的文件名,而不是匹配一个字符加“test”。
🧠 形象比喻:
ESCAPE就像在字符串中给特殊字符加“引号”,告诉数据库:“别急,这个字符不是通配符,它是普通字符。”
与 NOT LIKE 的搭配使用
除了 LIKE,你还可以使用 NOT LIKE 来排除某些模式。
比如,查出所有用户名不以“test”开头的用户:
SELECT username
FROM users
WHERE username NOT LIKE 'test%';
这在清理数据或筛选非测试账号时非常有用。
再比如,排除所有邮箱中包含“spam”字样的记录:
SELECT email
FROM users
WHERE email NOT LIKE '%spam%';
这样可以有效过滤掉垃圾邮件来源。
性能优化建议:何时该用 LIKE,何时不该用
虽然 LIKE 很强大,但使用不当会影响性能。以下是一些关键建议:
1. 避免前导通配符
如果写成 LIKE '%abc',数据库无法使用索引,必须全表扫描,效率极低。
比如:
-- ❌ 不推荐:前导通配符,性能差
SELECT name FROM users WHERE name LIKE '%明';
2. 优先使用前缀匹配
如果可能,尽量让通配符在末尾,比如 LIKE 'abc%',这时数据库可以使用 B-Tree 索引快速定位。
-- ✅ 推荐:前缀匹配,可走索引
SELECT name FROM users WHERE name LIKE '张%';
3. 考虑使用全文搜索
对于复杂的模糊搜索(如多个关键词、词干匹配等),建议使用 PostgreSQL 的 tsvector 和 tsquery 实现全文搜索,性能远优于 LIKE。
实际项目中的应用示例
假设你正在开发一个电商后台系统,需要实现商品搜索功能。用户输入“运动鞋”想查所有相关商品。
SELECT product_name, price
FROM products
WHERE product_name ILIKE '%运动鞋%'
OR product_name ILIKE '%跑鞋%'
OR product_name ILIKE '%运动鞋%'
OR product_name ILIKE '%运动休闲鞋%';
这个查询会返回所有包含“运动鞋”“跑鞋”等关键词的商品,支持大小写不敏感,非常实用。
如果你的搜索需求更复杂,还可以将 LIKE 与 OR、AND 结合,构建更灵活的查询逻辑。
总结与建议
PostgreSQL LIKE 子句 是处理模糊查询的得力工具,掌握它能让你在开发中更灵活地应对各种搜索需求。从基础的前缀匹配,到中间匹配、大小写不敏感搜索,再到特殊字符处理,它覆盖了大多数实际场景。
但也要注意:LIKE 不是万能的。在性能要求高的场景下,应避免使用前导通配符,优先考虑索引优化或使用全文搜索功能。
最后,记住一点:好的查询,不仅要有功能,还要有性能。在使用 LIKE 时,多思考一下是否可以优化模式,是否能利用索引,会让你的系统跑得更快、更稳。
掌握 LIKE,就是掌握了一种更聪明的“找数据”方式。希望这篇教程能帮你真正理解并灵活运用它。