• 2 min read

理解通配符 % 与 _ 的用法


在实际的数据库查询中,我们经常会遇到“只记得部分信息”的情况,比如只记得某位同学姓“刘”,或者想查找书名中包含“数据库”的所有书籍。这时候,精确的等值查找(=)就无能为力了。

在 SQL 中,谓词 LIKE 可以用来进行字符串的匹配。它的一般语法格式如下: [NOT] LIKE <匹配串> [ESCAPE '<换码字符>']

这里的 <匹配串> 可以是一个完整的字符串,也可以是含有通配符 %_ 的模糊匹配串。如果 LIKE 后面的匹配串中不含通配符,那么它的作用就相当于等于号(=);同理,NOT LIKE 就相当于不等于号(!=<>)。

今天我们就通过大量的例题,来彻底搞懂这两个神奇的通配符!

1. 百分号(%):代表任意长度的字符串

定义%(百分号)代表任意长度的字符串,长度甚至可以为 0。

这意味着 % 可以代替零个、一个或多个字符。我们来看几个具体的应用场景:

例题 1:匹配开头字符(“查找姓氏”)

需求:在学生表(Student)中查找所有姓“刘”的学生姓名。 SQL 语句

SELECT Sname FROM Student WHERE Sname LIKE '刘%';

解析刘% 表示第一个字符必须是“刘”,后面的字符无论是什么、有多少个(甚至没有)都可以匹配。例如“刘备”、“刘德华”、“刘”都能被成功检索。

例题 2:匹配包含字符(“关键词搜索”)

需求:在课程表(Course)中查找课程名中包含“网络”二字的所有课程。 SQL 语句

SELECT Cname FROM Course WHERE Cname LIKE '%网络%';

解析%网络% 表示只要字符串中间出现了“网络”两个字,不管它的前面或后面有什么字符,都算匹配成功。比如“计算机网络”、“网络安全技术”、“现代网络”都符合条件。

例题 3:匹配结尾字符(“后缀匹配”)

需求:在供应商表(S)中查找所有名称以“公司”结尾的供应商。 SQL 语句

SELECT SNAME FROM S WHERE SNAME LIKE '%公司';

解析%公司 表示字符串的最后两个字符必须是“公司”,前面的内容不限。


2. 下横线(_):代表任意单个字符

定义_(下横线)代表任意单个字符。

% 不同,_ 是严格占位的。写了几个 _,就代表有几个字符。

例题 4:固定长度匹配

需求:在学生表中查找姓“欧阳”且全名为三个汉字的学生。 SQL 语句

SELECT Sname FROM Student WHERE Sname LIKE '欧阳_';

解析:这里我们只使用了一个 _。它限制了匹配结果必须是“欧阳”加上任意一个单字符。因此,“欧阳锋”会被匹配,但“欧阳震华”则不会被匹配。

例题 5:指定特定位置的字符

需求:在学生表中查找名字的第二个字为“明”的所有学生。 SQL 语句

SELECT Sname FROM Student WHERE Sname LIKE '_明%';

解析:第一个 _ 占据了第一个字符的位置(不管姓什么),第二个字必须是“明”,后面的 % 表示“明”字之后的字符长度不限(单名、双名都可以)。例如“王明”、“李明华”都会被匹配。

例题 6:纯下划线占位

需求:查询所有全名正好为两字的学生。 SQL 语句

SELECT Sname FROM Student WHERE Sname LIKE '__'; 

解析:这里使用了两个下横线(注意中间没有空格)。这就要求字符串长度必须严格等于 2。


3. 高阶技巧:当查询内容本身包含 % 或 _ 怎么办?

通配符在模糊查询中大显身手,但如果我们要查找的字符串本身就包含通配符 %_ 怎么办?

这时候就要使用 ESCAPE '<换码字符>' 短语,对通配符进行转义了。我们可以自己指定一个转义字符(通常习惯用反斜杠 \),告诉数据库:“紧跟在这个转义字符后面的那个字符,不要把它当通配符看,就把它当成普通的文本符号。”

例题 7:查询本身包含下划线的字符串

需求:在课程表中查找课程名是以“DB_”开头的所有课程。 SQL 语句

SELECT Cname FROM Course WHERE Cname LIKE 'DB\_%' ESCAPE '\';

解析:在这里,我们声明了 \ 作为换码字符。匹配串 DB\_% 中的 \_ 就表示真实的下划线字符 _,而最后的 % 依然是通配符。所以它能查出“DB_Design”、“DB_Core”等课程。

例题 8:查询本身包含百分号的字符串

需求:在考核表中查找成绩描述为“100%及格”的记录。 SQL 语句

SELECT Record FROM Assessment WHERE Record LIKE '100\%%及格' ESCAPE '\';

解析:匹配串中的 \% 被转义为普通的 % 字符,而后面的 %及格 中,如果没有转义前缀符,它仍会被系统视为可能存在的后续字符串,或者我们可以直接将后面确定的文字写死。这样就能精准找到包含真实 % 的数据。


总结

模糊查询是数据库中最常用的检索手段之一:

  • 想放宽匹配长度,用 %
  • 想精确定位字符个数和位置,用 _
  • 若遇到文本里自带这两个符号,切记使用 ESCAPE 进行转义。