SQL SERVER 2008用Select操作处理数据(四)——Where条件
2017-09-17 18:49
288 查看
Where条件各筛选FROM子句输出结果并限制结果集中返回的行。条件可引用表中的数据、表达式、SQL SERVER内置标量函数。Where条件还可以利用几种可能的比较运算符和通配符,如下表。此外,使用布尔AND、OR和NOT运算符可以组合多个Where条件。
标准的比较运算符
忠告:为提高客户端/服务器性能,让数据库引擎限制返回的行数,而不是使客户端读取不必要的数据。
警告:包括!号的比较运算符不是ANSI标准的SQL。<>运算符可移植到SQL Server数据库以外的数据库系统,而!=运算符不可移植。
除了标准的比较运算符外,SQL还提供了4种特殊的比较运算符:BETWEEN、IN、LIKE和IS。IS 关键字主要用来测试null值和null值。
一般来说(但不总是),将否定的Where条件声明为肯定的条件可改善性能。
一、使用BETWEEN搜索条件
BETWEEN搜索条件查询范围内的值。但是该范围可能具有欺骗性,因为它是包含性的。例如1和10符合BETWEEN 1 and 10条件。当使用BETWEEN搜索条件时,第一个条件必须小于后面的值,因为BETWEEN搜索条件实际上是“大于等于第一个值,且小于第二个值”的简短表达方式。
在下面的例子中,BETWEEN用来选择所有的数量大于10小于21的数据。
Use WorkData --选择数据库
SELECT OrderID
FROM WorkOrder
Where OrderID BETWEEN 11 and 20
警告:BETWEEN 搜索条件通常和日期一起使用。不过,没有时间的BETWEEN运算符将查找最后一天的起始时间,而带有时间的BETWEEN运算符将向上舍入最后的毫秒以包括第二天的12:00:00:000。解决办法如下:
Where col>=StartDate and col<Ending Date+1
或者
Where col>= @StartDate+' 00:00:00' and col<=@EndDate+' 23:59:59'
(@StartDate、@EndDate为存储过程的字符型参数)
例如:where SalesDate>=’2017-9-1’ and SalesDate<’2017-10-1’
或者:where SalesDate>=’2017-9-1 00:00:00’ and SalesDate<’2017-9-30 23:59:59’
二、与列表比较
使用IN、SOME、ANY或ALL条件,WHERE条件可以比较测试值与列表中的值。每个运算符也可使用NOT来反转条件。
IN类似于“=”运算符,因为它搜索列表中的的精确匹配。如果该值在列表中,那么比较结果为真。例如:
Use Db1
SELECT TABLE1
FROM Name
Where Name IN (’张三’,’李四’)
以上语句等同于以下语句:
Use Db1
SELECT TABLE1
FROM Name
Where Name=’张三’OR Name=’李四’
IN运算符也搜索一系列列中的值。下面的例子就是搜索Name、City、Region或Country列中的文本“NC”:
Use db2
Select Name
From dbo.table2
Where ‘NC’IN (Name,City,Region,Country)
IN运算符可以和NOT一起使用,以排除某些行。证明否定命题是很难的,尤其是空值包括在内时。因为空值的意思是“未知的”,正在搜索的值可能存在于列表中。下面的代码示例说明了列表中的空值如何使得无法证明’A’不在列表中:
Select ‘Ab’ where ‘A’ Not IN (‘B’,null)
这里没有结果,因为的空值可能是“A”。由于SQL不能从逻辑上证明“A”不在列表中,因此Where子句返回假。对于NOT IN条件来说,如果列表中有空(null)值,则每行都将被判定为假。
三、使用LIKE搜索条件
LIKE搜索条件使用通配符搜索字符串内的模式。但是,该项通配符与您熟悉的MS-DOS的通配符有很大区别。
SQL通配符与MS-DOS通配符的区别
查找包含通配符的模式有两种可能的方法:将该通配符放入方括号内或在其之前放一个转义字符。后一种方法的技巧是,在like表达式中定义转义字符。
当使用LIKE运算符时,要知道数据库排序规则的排序决定区分大小写及一系列字符的排列顺序。可以使用关键字COLLATE来指定LIKE选自符使用的排序规则的排序顺序。
虽然LIKE运算可能非常有用,但它也会影响性能。索引基于列的开头部分,而不是列中的短语,如果您发现应用程序需要频繁使用LIKE运算符,则应该启用全文索引——一个强大的索引方法,该方法甚至考虑到了加权词和词尾变化,并且可以以表的形式返回结果集以供联结。
四、多个WHERE条件
使用布尔逻辑运算符AND、OR和NOT ,可以将多个WHERE条件组合在WHERE子句内。和乘、除自述运算符一样,布尔逻辑运算符存在俦顺序:首先是NOT,其次是AND,最后是OR,但注意用括号改变优先顺序:
如语句:
Select * from table1 where proname like ‘a%’ or price=10 and spec like ‘%25%’
与语句
Select * from table1 where (proname like ‘a%’ or price=10) and spec like ‘%25%’
的查询结果是完全不一样的!!
标准的比较运算符
说明 | 运算符 | 示例 |
等于 | = | Age=30 |
大于 | > | Age>30 |
大于等于 | >= | Age>=30 |
小于 | < | Age<30 |
关于等于 | <= | Age<=30 |
不等于 | <>或者!= | Age<>30或Age!=30 |
不小于 | !< | Age!<30 |
不大于 | !> | Age!>30 |
警告:包括!号的比较运算符不是ANSI标准的SQL。<>运算符可移植到SQL Server数据库以外的数据库系统,而!=运算符不可移植。
除了标准的比较运算符外,SQL还提供了4种特殊的比较运算符:BETWEEN、IN、LIKE和IS。IS 关键字主要用来测试null值和null值。
一般来说(但不总是),将否定的Where条件声明为肯定的条件可改善性能。
一、使用BETWEEN搜索条件
BETWEEN搜索条件查询范围内的值。但是该范围可能具有欺骗性,因为它是包含性的。例如1和10符合BETWEEN 1 and 10条件。当使用BETWEEN搜索条件时,第一个条件必须小于后面的值,因为BETWEEN搜索条件实际上是“大于等于第一个值,且小于第二个值”的简短表达方式。
在下面的例子中,BETWEEN用来选择所有的数量大于10小于21的数据。
Use WorkData --选择数据库
SELECT OrderID
FROM WorkOrder
Where OrderID BETWEEN 11 and 20
警告:BETWEEN 搜索条件通常和日期一起使用。不过,没有时间的BETWEEN运算符将查找最后一天的起始时间,而带有时间的BETWEEN运算符将向上舍入最后的毫秒以包括第二天的12:00:00:000。解决办法如下:
Where col>=StartDate and col<Ending Date+1
或者
Where col>= @StartDate+' 00:00:00' and col<=@EndDate+' 23:59:59'
(@StartDate、@EndDate为存储过程的字符型参数)
例如:where SalesDate>=’2017-9-1’ and SalesDate<’2017-10-1’
或者:where SalesDate>=’2017-9-1 00:00:00’ and SalesDate<’2017-9-30 23:59:59’
二、与列表比较
使用IN、SOME、ANY或ALL条件,WHERE条件可以比较测试值与列表中的值。每个运算符也可使用NOT来反转条件。
IN类似于“=”运算符,因为它搜索列表中的的精确匹配。如果该值在列表中,那么比较结果为真。例如:
Use Db1
SELECT TABLE1
FROM Name
Where Name IN (’张三’,’李四’)
以上语句等同于以下语句:
Use Db1
SELECT TABLE1
FROM Name
Where Name=’张三’OR Name=’李四’
IN运算符也搜索一系列列中的值。下面的例子就是搜索Name、City、Region或Country列中的文本“NC”:
Use db2
Select Name
From dbo.table2
Where ‘NC’IN (Name,City,Region,Country)
IN运算符可以和NOT一起使用,以排除某些行。证明否定命题是很难的,尤其是空值包括在内时。因为空值的意思是“未知的”,正在搜索的值可能存在于列表中。下面的代码示例说明了列表中的空值如何使得无法证明’A’不在列表中:
Select ‘Ab’ where ‘A’ Not IN (‘B’,null)
这里没有结果,因为的空值可能是“A”。由于SQL不能从逻辑上证明“A”不在列表中,因此Where子句返回假。对于NOT IN条件来说,如果列表中有空(null)值,则每行都将被判定为假。
三、使用LIKE搜索条件
LIKE搜索条件使用通配符搜索字符串内的模式。但是,该项通配符与您熟悉的MS-DOS的通配符有很大区别。
SQL通配符与MS-DOS通配符的区别
说明 | SQL通配符 | MS-DOS通配符 | 示例 |
任意数量(0或更多)的任意字符 | % | * | Col like ‘A%’ Col like ‘%A%’ |
一个任意字符 | _ | ? | Col like ‘ABD_’ |
所附的字符中的一个 | [] | n/a | Col like ‘[a-g]’ |
匹配不在字符范围内 | [^] | n/a | Col like ‘[^w-z]’ Col like ‘[^wxyz]’ |
当使用LIKE运算符时,要知道数据库排序规则的排序决定区分大小写及一系列字符的排列顺序。可以使用关键字COLLATE来指定LIKE选自符使用的排序规则的排序顺序。
虽然LIKE运算可能非常有用,但它也会影响性能。索引基于列的开头部分,而不是列中的短语,如果您发现应用程序需要频繁使用LIKE运算符,则应该启用全文索引——一个强大的索引方法,该方法甚至考虑到了加权词和词尾变化,并且可以以表的形式返回结果集以供联结。
四、多个WHERE条件
使用布尔逻辑运算符AND、OR和NOT ,可以将多个WHERE条件组合在WHERE子句内。和乘、除自述运算符一样,布尔逻辑运算符存在俦顺序:首先是NOT,其次是AND,最后是OR,但注意用括号改变优先顺序:
如语句:
Select * from table1 where proname like ‘a%’ or price=10 and spec like ‘%25%’
与语句
Select * from table1 where (proname like ‘a%’ or price=10) and spec like ‘%25%’
的查询结果是完全不一样的!!
相关文章推荐
- SQL SERVER 2008用Select操作处理数据(五)——列、星号、别名和表达
- SQL SERVER 2008用Select操作处理数据(六)——ORDER BY子句
- SQL SERVER 2008用Select操作处理数据(三)——From子句数据源
- SQL SERVER 2008用Select操作处理数据(一)——查询语句的语法流
- SQL SERVER 2008用Select操作处理数据(二)——查询语句的逻辑流
- Visual C# 2008+SQL Server 2005 数据库与网络开发-- 7.3 使用ADO .NET处理数据
- 也谈SQL Server 2008 处理隐式数据类型转换在执行计划中的增强
- SQL Server 2008 对XML 数据类型操作
- sql server 2008 操作数据表
- Visual C# 2008+SQL Server 2005 数据库与网络开发-- 4.3 操作数据表
- sql server 2008 操作数据表
- Visual C# 2008+SQL Server 2005 数据库与网络开发--8.2.2 用户数据操作的并发
- SQL Server 2008 数据库误操作后的数据恢复
- 也谈SQL Server 2008 处理隐式数据类型转换在执行计划中的增强 (续)
- SQL Server 2008导出数据 ---为SQL脚本的操作步骤
- 也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)
- SQL Server 2008 对XML 数据类型操作
- SQL Server 2008 对XML 数据类型操作
- SQL Server 2008导出数据为SQL脚本的操作步骤
- 也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)