到目前为止,我们讲解的数据过滤方式都是针对特定值的过滤,比如“检索所有年龄为25的所有员工信息”、“检索所有工资介于2500元至3800元之间的所有记录”,但是这种过滤方式并不能满足一些模糊的过滤方式。比如,检索所有姓名中含有“th”的员工或者检索所有姓“王”的员工,实现这样的检索操作必须使用通配符进行过滤。
SQL中的通配符过滤使用LIKE关键字,可以像使用OR、AND等操作符一样使用它,它是一个二元操作符,左表达式为待匹配的字段,而右表达式为待匹配的通配符表达式。通配符表达式由通配符和普通字符组成,主流数据库系统支持的通配符有单字符匹配和多字符匹配,有的数据库系统还支持集合匹配。
- 单字符匹配
进行单字符匹配的通配符为半角下划线“”,它匹配单个出现的字符。比如通配符表达式“b_d”匹配第一个字符为b、第二个字符为任意字符、第三个字符为d的字符串,“bed”、“bad”都能匹配这个表达式,而“bd”、“abc”、“build”等则不能匹配这个表达式;通配符表达式“_oo”匹配第一个字符为任意字符、第二个字符为o、第三个字符为o、第四个字符为任意字符的字符串,“look”、“took”、“cool”都能匹配这个表达式,而“rom”、“todo”等则不能匹配这个表达式。
下面来演示一下单字符匹配的用法。我们来检索T_Employee表中FName字段匹配如下规则的数据行:以任意字符开头,剩余部分为“erry”。根据通配符表达式语法,我们得知这个匹配规则对应的通配符表达式为“_erry”,因此编写如下的SQL:
SELECT * FROM T_Employee WHERE FName LIKE "_erry"
执行完毕我们就能在输出结果中看到下面的执行结果:
“Jerry”、“Kerry”两个字符串能够匹配通配符表达式“_erry”,所以被显示到了结果集中,而其他数据行则由于不匹配此通配符表达式,所以被过滤掉了。
单字符匹配在通配符表达式中可以出现多次,比如我们要检索长度为4、第三个字符为“n”、其它字符为任意字符的姓名。根据通配符表达式语法,我们得知这个匹配规则对应的通配符表达式为“_n”(注意前两个字符为连续的两个下划线),那么需要编写如下的SQL:
SELECT * FROM T_Employee WHERE FName LIKE "__n_"
执行完毕我们就能在输出结果中看到下面的执行结果:
- 多字符匹配
使用下划线可以实现“匹配长度为5、以ab开头、剩余字符任意”的功能,而对于“匹配以k开头,长度不限,剩余字符任意”这样的需求则无法满足,这时就需要使用多字符匹配了。进行多字符匹配的通配符为半角百分号“%”,它匹配任意次数(零或多个)出现的任意字符。比如通配符表达式“k%”匹配以“k”开头、任意长度的字符串,“k”、“kerry”、“kb”都能匹配这个表达式,而“ark”、“luck”、“3kd”等则不能匹配这个表达式;配符表达式“b%t”匹配以“b”开头、以“t”结尾、任意长度的字符串,“but”、“bt”、“belt”都能匹配这个表达式,而“turbo”、“tube”、“tb”等则不能匹配这个表达式。
下面来演示一下多字符匹配的用法。我们来检索T_Employee表中FName字段匹配如下规则的数据行:以“T”开头长度,长度任意。根据通配符表达式语法,我们得知这个匹配规则对应的通配符表达式为“T%”,因此编写如下的SQL:
-
SELECT * FROM T_Employee WHERE FName LIKE "T%"
执行完毕我们就能在输出结果中看到下面的执行结果:
接着我们来检索姓名中包含字母“n”的员工信息,编写如下SQL:
*
SELECT * FROM T_Employee WHERE FName LIKE "%n%"
执行完毕我们就能在输出结果中看到下面的执行结果:
单字符匹配和多字符匹配还可以一起使用。我们来检索T_Employee表中FName字段匹配如下规则的数据行:最后一个字符为任意字符、倒数第二个字符为“n”、长度任意的字符串。
根据通配符表达式语法,我们得知这个匹配规则对应的通配符表达式为“%n_”,因此编写如下的SQL:
-
SELECT * FROM TEmployee WHERE FName LIKE "%n"
```
执行完毕我们就能在输出结果中看到下面的执行结果: