SQL 3.高级数据过滤 - 1 通配符过滤

来源:互联网 发布:机明自动编程破解版 编辑:程序博客网 时间:2024/05/29 02:15

到目前为止,我们讲解的数据方式都是针对特定值的过滤,比如“检索所有年龄为25的所有员工信息”、“检索所有工资助2500元~3800元之间的所有记录”,但是这种过滤方式并不能满足一些模糊的过滤方式。

比如检索所有姓名中含有“th”员工或者检索所有姓“王”的员工,实现这样的检索操作必须使用通配符进行过滤。

SQL中的通配符过滤使用LIKE关键字,可以向使用OR、AND等操作符一样使用它,它是一个二元操作符,左表达式为待匹配的字段,而右表达式为待匹配的通配符表达式。通配符表达式由通配符和普通字符组成,主流数据库支持的通配符有单字符匹配多字符匹配,有的数据库系统还支持集合匹配(MS-SQLSERVER)。

 

 

1. 单字符匹配

进行单字符匹配的通配符为半角下划线“_”, 它匹配单个出现的字符。

比如,通配符表达式“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'

+---------+-------+------+---------+
| FNumber | FName | FAge | FSalary |
+---------+-------+------+---------+
| DEV002  | Jerry |   28 | 2300.00 |
+---------+-------+------+---------+

 

"Jerry"能够匹配通配符表达式“_erry”所以被显示到了结果集中,而其他数据则由于不撇皮茨通配符表达式,所以被过滤掉了。

单字符匹配在通配符表达式中可以出现多次,比如我们要检索长度为4、第三个字符为“n”、其他字符为任意字符的姓名。根据通配符表达式语法可知这个匹配规则对应的通配符表达式为“__n_”(注意前两个字符为连续的两个下划线),那么需要编写如下的SQL:

SELECT * FROM T_Employee WHERE FName LIKE '__n_'

+---------+-------+------+---------+
| FNumber | FName | FAge | FSalary |
+---------+-------+------+---------+
| HR001   | Jane  |   23 | 4300.00 |
| HR002   | Tina  |   25 | 3300.00 |
+---------+-------+------+---------+

 

 

2. 多字符匹配

使用下划线可以实现“匹配长度为5、以ab开头、剩余字符任意”的功能,而对于“匹配以k开头,长度不限,剩余字符任意”这样的需求则无法满足,这时就需要使用多字符匹配了。进行多字符匹配的通配符为半角百分号“%”,它匹配任意次数(零个或者多个)出现的任意字符。比如通配符表达式"k%"匹配以k开头、任意长度的字符串,“k”、“kerry”、“kb”都能匹配这个表达式,而“ark”、“luck”、“3kd”等不能匹配这个表达式;通配符表达式“b%t”匹配以b开头、以t结尾、任意长度的字符串,“but”、“bt”、“belt”都能匹配这个表达式,而“turbo”、“tube”、“tb”等不能匹配表达式。

 

下面来演示一下多字符匹配的用法。我们来检索T_Employee表中FName字段匹配如下规则的数据行:

1) 以“T”开头长度,长度不限。根据通配符表达式语法,我们可以知这个匹配规则对应的通配符表达式为“T%”,因此编写如下的SQL:

SELECT * FROM T_Employee WHERE FName LIKE 'T%'

+----------+-------+------+---------+
| FNumber  | FName | FAge | FSalary |
+----------+-------+------+---------+
| DEV001   | Tom   |   25 | 8300.00 |
| HR002    | Tina  |   25 | 3300.00 |
| SALES001 | Timmy |   25 | 5300.00 |
+----------+-------+------+---------+

 

2) 接下来我们检索姓名中包含字母"n"的员工的信息,编写如下SQL:

SELECT * FROM T_Employee WHERE FName LIKE '%n%'

+----------+-------+------+---------+
| FNumber  | FName | FAge | FSalary |
+----------+-------+------+---------+
| HR001    | Jane  |   23 | 4300.00 |
| HR002    | Tina  |   25 | 3300.00 |
| SALES002 | Stone |   35 | 8300.00 |
+----------+-------+------+---------+

 

3)单字符匹配和多字符还可以一起使用。我们来检索T_Employee表中FName字段匹配如下规则的数据行:

最后一个字符为任意字符、倒数第二个字符为n、长度不限的字符串。

根据通配符表达式语法,我们可以知道这个匹配规则对应的通配符表达式为“%n_”,因此编写如下的SQL:

SELECT * FROM T_Employee WHERE FName LIKE '%n_'

+----------+-------+------+---------+
| FNumber  | FName | FAge | FSalary |
+----------+-------+------+---------+
| HR001    | Jane  |   23 | 4300.00 |
| HR002    | Tina  |   25 | 3300.00 |
| SALES002 | Stone |   35 | 8300.00 |
+----------+-------+------+---------+

 

4)配合and与or使用

检索T_Employee表中FName字段匹配:以S或J开头,长度不限。

SELECT * FROM T_Employee WHERE FName LIKE 'S%' or FName LIKE 'J%'

 

不以S或J开头,长度不限。

SELECT * FROM T_Employee WHERE FName NOT(FName LIKE 'S%' AND FName LIKE 'J%')

 

通配符过滤是一个非常强大的功能,不过在使用通配符过滤进行检索的时候

数据库系统会对全表进行扫描,所以执行速度非常慢。因此不要过多使用通配符过滤

原创粉丝点击