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%')
通配符过滤是一个非常强大的功能,不过在使用通配符过滤进行检索的时候,
数据库系统会对全表进行扫描,所以执行速度非常慢。因此不要过多使用通配符过滤
- SQL 3.高级数据过滤 - 1 通配符过滤
- SQL高级数据过滤
- Mysql必知必会(笔记)【高级数据过滤、通配符进行过滤】
- SQL通配符过滤
- MySQL通配符过滤数据
- MySQL数据过滤和通配符过滤.md
- SQL 3.高级数据过滤 - 2 空值检测
- SQL 3. 高级数据过滤 - 3 反义运算符
- SQL 3. 高级数据过滤 - 4 多值检测
- SQL 3. 高级数据过滤 - 5 范围值检测
- 读书笔记--SQL必知必会05--高级数据过滤
- SQL高级过滤查询
- mysql过滤数据(三)用通配符进行过滤
- MySQL--操作简记(where过滤,通配符过滤数据)
- sql里的通配符过滤 '_' '%' '[]'
- SQL必知必会 笔记 第五章 高级过滤数据
- sql数据过滤
- SQL必知必会--过滤数据
- Linux2.6 内核的 Initrd 机制解析
- asp生成excel
- 十二 设计模式之策略模式
- 分析javax.xml.parsers.FactoryConfigurationError(给出异常分析)
- my 和 our 变量申明的含义
- SQL 3.高级数据过滤 - 1 通配符过滤
- 谁知道华硕A42jv的bios里面设置项为什么那么少啊
- 软件需求层次
- 学习oracle的六条经验(转载,有疑议请说出哦)
- 写给linux Shell程序初学者
- grub 修改
- 需求获取
- 测试驱动开发入门-CppUnit
- 测试驱动开发入门-CppUnit