1 通配符过滤
SQL中的通配符过滤使用LIKE关键字,可以像使用OR、AND 等操作符一样使用它,它是一个二元操作符,左表达式为待匹配的字段,而右表达式为待匹配的通配符表达式。通配符表达式由通配符和普通字符组成,主流数据库系统支持的通配符有单字符匹配和多字符匹配,有的数据库系统还支持集合匹配。
1.1 单字符匹配
进行单字符匹配的通配符为半角下划线“_”
SELECT * FROM T_Employee
WHERE FName LIKE '_erry' <<以任意字符开头,剩余部分为“erry"
SELECT * FROM T_Employee
WHERE FName LIKE '__n_' <<检索长度为4、第三个字符为“n”、其它字符为任意字符的姓名
1.2 多字符匹配
进行多字符匹配的通配符为半角百分号“%”
SELECT * FROM T_Employee
WHERE FName LIKE 'T%' <<姓名以“T”开头长度,长度任意的员工信息
SELECT * FROM T_Employee
WHERE FName LIKE '%n%' <<姓名中包含字母“n”的员工信息
SELECT * FROM T_Employee
WHERE FName LIKE '%n_' <<最后一个字符为任意字符、倒数第二个字符为“n”、长度任意的字符串
1.3 集合匹配
集合匹配只在MSSQLServer 上提供支持,在MYSQL、Oracle、DB2 等数据库中不支持,必须采用变通的手段来实现。
进行集合匹配的通配符为“[]”,方括号中包含一个字符集,它匹配与字符集中任意一个字符相匹配的字符。
SELECT * FROM T_Employee
WHERE FName LIKE '[SJ]%' <<以“S”或者“J“开头长度,长度任意。
还可以使用否定符“^”来对集合取反,它匹配不与字符集中任意一个字符相匹配的字符。
SELECT * FROM T_Employee
WHERE FName LIKE '[^SJ]%' <<不以“S”或者“J“开头长度,长度任意。
其他数据库系统可以变通为如下:
SELECT * FROM T_Employee
WHERE FName LIKE 'S%' OR FName LIKE 'J%'
SELECT * FROM T_Employee
WHERE NOT(FName LIKE 'S%') AND NOT(FName LIKE 'J%')
通配符过滤一个非常强大的功能,不过在使用通配符过滤进行检索的时候,数据库系统
会对全表进行扫描,所以执行速度非常慢。因此不要过分使用通配符过滤,在使用其他方式
可以实现的效果的时候就应该避免使用通配符过滤。
2 空值检测
SELECT * FROM T_Employee
WHERE FNAME=null <<这语句查询不出字段为空值的记录,因为在SQL语句中对空值的处理有些特别,不能使用普通的等于运算符进行判断,而要使用IS NULL关键字
SELECT * FROM T_Employee
WHEREFNAME IS NULL<<查询所有姓名未知的员工信息
SELECT * FROM T_Employee
WHEREFNAME IS NOT NULL<<查询所有姓名已知的员工信息
SELECT * FROM T_Employee
WHERE FNAME IS NOT NULL AND FSalary <5000 <<查询所有姓名已知且工资小于5000的员工信息
3 反义运算符
MSSQLServer、DB2提供了“!”运算符来对运算符求反义,也就是“!=”表示“不等于”、“!<”表示“不小于”,而“!>”表示“不大于”。
SELECT * FROM T_Employee
WHERE FAge!=22 AND FSALARY!<2000 <<检索所有年龄不等于22岁并且工资不小于2000元
如果在其他数据库系统上则可以用其他的变通的方式实现,最常用的变通实现方式有两种:使用同义运算符、使用
NOT运算符。
SELECT * FROM T_Employee
WHERE FAge<>22 AND FSALARY>=2000 <<检索所有年龄不等于22岁并且工资不小于2000元
SELECT * FROM T_Employee
WHERE NOT(FAge=22) AND NOT(FSALARY<2000) <<检索所有年龄不等于22岁并且工资不小于2000元
4 多值检测
为了解决进行多个离散值的匹配问题,SQL提供了IN语句,使用IN我们只要指定要匹配的数据集
合就可以了,使用方法为“IN (值1,值2,值3……)”。
SELECT FAge,FNumber,FName FROM T_Employee
WHERE FAge IN (23,25,28) <<公司要为年龄为23岁、25岁和28岁的员工发福利,请将他们的年龄、工号和姓名检索出来
以上执行结果和使用OR语句来连接多个等于判断的方式是一样的
SELECT FAge,FNumber,FName FROM T_Employee
WHERE FAge=21 OR FAge=22 OR FAge=25
5 范围值检测
SQL提供范围值检测的语句“BETTWEEN AND”,它可以用来检测一个值是否处于某个范围中(包括范围的边界值,也就是闭区间)。使用方法如下“字段名BETTWEEN 左范围值AND 右范围值”,其等价于“字段名>=左范围值 AND 字段名<=右范围值”。
SELECT * FROM T_Employee
WHERE FAGE BETWEEN 23 AND 27 <<检索所有年龄介于23岁到27岁之间的员工信息
SELECT * FROM T_Employee
WHERE (FSalary BETWEEN 2000 AND 3000)
OR (FSalary BETWEEN 5000 AND 8000) <<检索所有工资介于2000元到3000元之间以及5000元到8000元的员工信息
数据库系统对“BETTWEEN AND”进行了查询优化,使用它进行范围值检测将会得到比其他方式更好的性能,因此在进行范围值检测的时候应该优先使用“BETTWEEN AND”。需要注意的就是“BETTWEEN AND”在进行检测的时候是包括了范围的边界值的(也就是闭区间),如果需要进行开区间或者半开半闭区间的范围值检测的话就必须使用其他的解决方案了
6 低效的“WHERE 1=1”
使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。