SQL 通配符(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据库查询的世界中,SQL 通配符如同一把万能钥匙,帮助开发者快速定位、筛选和管理海量数据。无论是寻找特定模式的字符串,还是探索数据中的隐藏规律,通配符都能简化复杂的查询逻辑。对于编程初学者和中级开发者而言,掌握这一工具不仅能够提升查询效率,更能为后续学习更高级的数据库操作打下坚实基础。
本文将从基础概念出发,结合实际案例和代码示例,深入解析SQL 通配符的核心用法,帮助读者逐步构建从“理解原理”到“灵活应用”的能力。
基础概念:通配符与 LIKE 运算符
在 SQL 中,通配符通常与 LIKE
运算符配合使用,用于模式匹配。LIKE
的作用是检查某一列的值是否符合指定的模式,而通配符则充当了“模糊匹配”的角色。
关键术语解释
- LIKE 运算符:用于在 WHERE 子句中执行模式匹配,语法为
WHERE column_name LIKE pattern
。 - 通配符:特殊字符,用于定义模糊匹配的规则。最常见的两种通配符是
%
(百分号)和_
(下划线)。
基本语法示例
SELECT * FROM users
WHERE username LIKE 'A%';
这条语句的作用是:从 users
表中检索所有以字母 "A" 开头的 username
。
核心通配符详解:% 和 _ 的使用场景
1. %
通配符:匹配任意长度的字符
% 可以匹配任意数量的字符(包括零个字符)。例如:
LIKE 'Ap%'
:匹配 "Apple"、"Apartment"、"App" 等所有以 "Ap" 开头的字符串。LIKE '%le'
:匹配 "Apple"、"Banana"(不匹配)、"Candle" 等以 "le" 结尾的字符串。
比喻理解:
可以将 %
视为“橡皮鸭”——它能灵活适应任何长度的“内容填充”,但必须严格匹配两侧的固定字符。
实例分析
假设有一个 products
表,包含字段 product_name
和 price
,执行以下查询:
SELECT product_name, price
FROM products
WHERE product_name LIKE '%Phone%';
这条语句将返回所有名称中包含 "Phone" 的产品,例如 "Smart Phone"、"Wireless Headphone"(不匹配)或 "Phone Case"。
2. _
通配符:匹配单个字符
_ 仅匹配一个单一字符,且字符类型不限(可以是字母、数字或符号)。例如:
LIKE '_at'
:匹配 "Cat"、"Bat"、"Sat"(但不匹配 "Flat")。LIKE 'A__e'
:匹配 "Apple"(不匹配)、"Appe"(不匹配)、"A12e"(符合)。
比喻理解:
可以将 _
想象为“单格空格”,它必须严格占据一个位置,但允许填入任何字符。
实例分析
假设有一个 employees
表,包含字段 first_name
和 department
,执行以下查询:
SELECT first_name
FROM employees
WHERE first_name LIKE 'J_n';
这条语句将返回所有名字为 "John"(J后接任意字符再接n)、"Jan" 或 "J3n" 的记录。
进阶用法:组合通配符与逻辑运算符
1. 组合 %
和 _
实现复杂匹配
通过组合 %
和 _
,可以构建更精确的查询条件。例如:
LIKE 'A%n'
:匹配以 "A" 开头,以 "n" 结尾的字符串,如 "Ant"、"Apple is nice"(不匹配)。LIKE 'T__%s'
:匹配以 "T" 开头,第三位后任意位置以 "s" 结尾的字符串,如 "TestString"(符合)、"T123s"(符合)。
实例分析
假设有一个 books
表,包含字段 title
和 author
,执行以下查询:
SELECT title
FROM books
WHERE title LIKE '_%SQL%_';
这条语句要求标题必须:
- 长度至少为 3 个字符(首字符由
_
匹配,后续%
允许任意字符); - 包含 "SQL" 这个子串;
- 以任意字符结尾。
可能的匹配结果包括 "SQL Basics"(符合)、"Advanced SQL"(符合)等。
2. 结合 NOT LIKE
排除特定模式
使用 NOT LIKE
可以反向筛选数据。例如:
SELECT email
FROM users
WHERE email NOT LIKE '%.com';
这条语句将返回所有邮箱地址不以 .com
结尾的记录(如 .org
、.net
等)。
常见问题与注意事项
1. 大小写敏感性问题
不同数据库对大小写的处理方式不同:
- MySQL 默认不区分大小写(除非配置了二进制排序规则)。
- PostgreSQL 默认区分大小写。
解决方案:
若需跨平台兼容,建议使用 LOWER()
或 UPPER()
函数统一转换:
SELECT * FROM products
WHERE LOWER(product_name) LIKE '%phone%';
2. 通配符的性能影响
过度使用通配符可能导致全表扫描,降低查询效率。例如:
-- 避免:
SELECT * FROM logs WHERE message LIKE '%error%';
-- 推荐:
SELECT * FROM logs WHERE message LIKE 'error%';
前者需要遍历所有记录,而后者只需检查以 "error" 开头的条目。
实战案例:综合应用与调试技巧
案例 1:筛选特定格式的电话号码
假设电话号码格式为 "XXX-XXXXXXX"(如 "138-12345678"),但部分数据可能包含空格或特殊符号:
SELECT phone_number
FROM customers
WHERE phone_number LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';
注意:
- 不同数据库对
[ ]
的支持不同(如 MySQL 不支持此语法)。 - 可改用
REGEXP
或正则表达式实现更灵活的匹配。
案例 2:排除特殊字符
假设需排除包含特殊符号(如 #
、$
)的用户名:
SELECT username
FROM users
WHERE username NOT LIKE '%#%'
AND username NOT LIKE '%$%';
结论
通过本文的讲解,读者应已掌握SQL 通配符的核心用法及其在实际场景中的应用价值。从基础的 %
和 _
到复杂的组合逻辑,通配符为数据查询提供了极大的灵活性。然而,合理使用通配符需兼顾效率与准确性:
- 简单模式:优先使用
%
或_
单独匹配; - 复杂场景:结合逻辑运算符或正则表达式增强能力;
- 性能优化:避免无意义的全表扫描。
掌握这些技巧后,开发者可以更高效地从数据库中提取所需信息,为数据分析、业务决策等场景提供有力支持。
(全文约 1800 字)