Skip to content

SQL 通配符

SQL 通配符用于在 LIKE 运算符中进行模糊匹配,它们可以替代一个或多个字符。

常用通配符

通配符描述示例
%替代任意长度的任意字符(包括 0 个)LIKE '张%' 匹配以 "张" 开头的字符串
_替代单个任意字符LIKE '张_' 匹配以 "张" 开头且长度为 2 的字符串
[charlist]匹配字符列表中的任意一个字符LIKE '[张李]%' 匹配以 "张" 或 "李" 开头的字符串
[^charlist] 或 [!charlist]匹配不在字符列表中的任意一个字符LIKE '[^张李]%' 匹配不以 "张" 或 "李" 开头的字符串

注意事项

  • %_ 是标准的 SQL 通配符,被所有关系型数据库支持。
  • [charlist][^charlist] 是 SQL Server 和 MS Access 支持的通配符,在 MySQL 中不支持。
  • 在 MySQL 中,可以使用正则表达式来实现类似的功能。

示例

假设我们有一个名为 students 的表,包含以下数据:

idnameagegrade
1张三18高三
2李四17高二
3王五19高三
4赵六16高一
5钱七18高三
6张小明17高二
7李华18高三

示例 1:使用 % 通配符

查找名字中包含 "小" 的学生:

sql
SELECT * FROM students WHERE name LIKE '%小%';

结果:

idnameagegrade
6张小明17高二

示例 2:使用 _ 通配符

查找名字长度为 2 个字符的学生:

sql
SELECT * FROM students WHERE name LIKE '__';

结果:

idnameagegrade
1张三18高三
2李四17高二
3王五19高三
4赵六16高一
5钱七18高三
7李华18高三

示例 3:使用 [charlist] 通配符(SQL Server/MS Access)

查找名字以 "张" 或 "李" 开头的学生:

sql
SELECT * FROM students WHERE name LIKE '[张李]%';

结果:

idnameagegrade
1张三18高三
2李四17高二
6张小明17高二
7李华18高三

示例 4:使用 [^charlist] 通配符(SQL Server/MS Access)

查找名字不以 "张" 或 "李" 开头的学生:

sql
SELECT * FROM students WHERE name LIKE '[^张李]%';

结果:

idnameagegrade
3王五19高三
4赵六16高一
5钱七18高三

示例 5:MySQL 中的正则表达式

在 MySQL 中,可以使用 REGEXPRLIKE 操作符来使用正则表达式:

查找名字以 "张" 或 "李" 开头的学生:

sql
SELECT * FROM students WHERE name REGEXP '^[张李]';

结果:

idnameagegrade
1张三18高三
2李四17高二
6张小明17高二
7李华18高三

通配符的使用技巧

  1. 精确匹配:如果需要匹配包含通配符本身的字符串,需要使用转义字符。不同的数据库系统可能有不同的转义字符,例如在 MySQL 中使用 \ 作为转义字符。

  2. 性能考虑:使用通配符(特别是以 % 开头的模式)可能会导致全表扫描,影响查询性能。对于大型表,建议使用索引或其他优化方法。

  3. 组合使用:可以组合使用多个通配符来实现更复杂的匹配模式。

小结

SQL 通配符是一种用于模糊匹配的强大工具,通过与 LIKE 运算符一起使用,可以灵活地查找符合特定模式的记录。不同的数据库系统可能支持不同的通配符,需要根据实际使用的数据库系统选择正确的语法。