SQL通配符
SQL 通配符详解
SQL 通配符是用于在 LIKE 操作符中匹配文本模式的特殊字符,主要用于模糊查询。它们通常与 WHERE 子句一起使用,特别适合在不确定完整字符串或需要部分匹配时使用。
主要通配符
1. % 百分号
- 功能:匹配任意数量(包括零个)的任意字符
- 示例:
sql
-- 查找所有以 'A' 开头的名字 SELECT * FROM employees WHERE first_name LIKE 'A%'; -- 查找包含 'son' 的名字 SELECT * FROM employees WHERE last_name LIKE '%son%'; -- 查找以 'n' 结尾的名字 SELECT * FROM employees WHERE last_name LIKE '%n';
2. _ 下划线
- 功能:匹配单个任意字符
- 示例:
sql
-- 查找第二个字母是 'a' 的名字 SELECT * FROM employees WHERE first_name LIKE '_a%'; -- 查找正好5个字母且以 's' 结尾的名字 SELECT * FROM employees WHERE last_name LIKE '____s';
3. [] 方括号(特定数据库支持)
- 功能:匹配括号内的任意单个字符(主要用于 SQL Server)
- 示例:
sql
-- SQL Server 示例:查找第一个字母是 A、B 或 C 的名字 SELECT * FROM employees WHERE first_name LIKE '[ABC]%'; -- 查找第二个字母是 a、e 或 i 的名字 SELECT * FROM employees WHERE first_name LIKE '_[aei]%';
4. [^] 或 [!](特定数据库支持)
- 功能:匹配不在括号内的任意单个字符(SQL Server)
- 示例:
sql
-- SQL Server 示例:查找第一个字母不是 A、B 或 C 的名字 SELECT * FROM employees WHERE first_name LIKE '[^ABC]%';
转义通配符
如果需要搜索包含通配符本身的字符串(如查找包含 % 或 _ 的值),需要使用 ESCAPE 子句:
sql
| -- 查找包含下划线 '_' 的名字 | |
| SELECT * FROM employees WHERE first_name LIKE '%\_%' ESCAPE '\'; | |
| -- 查找包含百分号 '%' 的名字 | |
| SELECT * FROM employees WHERE first_name LIKE '%\%%' ESCAPE '\'; |
不同数据库的通配符支持
| 通配符 | MySQL/MariaDB | PostgreSQL | SQL Server | Oracle |
|---|---|---|---|---|
% |
支持 | 支持 | 支持 | 支持 |
_ |
支持 | 支持 | 支持 | 支持 |
[] |
不支持 | 不支持 | 支持 | 不支持 |
[^] |
不支持 | 不支持 | 支持 | 不支持 |
性能考虑
- 避免前导通配符:
LIKE '%abc'或LIKE '_abc'通常无法使用索引,可能导致全表扫描 - 后缀通配符更高效:
LIKE 'abc%'可以利用索引(如果列上有索引) - 考虑全文索引:对于复杂的文本搜索需求,考虑使用全文索引功能
实际应用示例
1. 查找特定格式的电话号码
sql
| -- 查找格式为 (XXX) XXX-XXXX 的电话号码 | |
| SELECT * FROM customers WHERE phone LIKE '(___) ___-____'; |
2. 查找特定模式的电子邮件
sql
| -- 查找 gmail 或 yahoo 邮箱 | |
| SELECT * FROM users WHERE email LIKE '%@gmail.com' OR email LIKE '%@yahoo.com'; |
3. 查找产品代码中的特定模式
sql
| -- 查找产品代码以 'AB' 开头,第三个字符是数字的产品 | |
| SELECT * FROM products WHERE product_code LIKE 'AB_[0-9]%'; |
通配符是SQL中非常有用的功能,但应谨慎使用以避免性能问题。在可能的情况下,尽量使用更精确的匹配条件。
浙公网安备 33010602011771号