理解通配符 % 与 _ 的用法
在实际的数据库查询中,我们经常会遇到“只记得部分信息”的情况,比如只记得某位同学姓“刘”,或者想查找书名中包含“数据库”的所有书籍。这时候,精确的等值查找(=)就无能为力了。
在 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进行转义。