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_nameprice,执行以下查询:

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_namedepartment,执行以下查询:

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 表,包含字段 titleauthor,执行以下查询:

SELECT title  
FROM books  
WHERE title LIKE '_%SQL%_';  

这条语句要求标题必须:

  1. 长度至少为 3 个字符(首字符由 _ 匹配,后续 % 允许任意字符);
  2. 包含 "SQL" 这个子串;
  3. 以任意字符结尾。

可能的匹配结果包括 "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 字)

最新发布