T-SQL中的Select查询(续2)

原创 2006年06月04日 16:38:00

T-SQL中的Select查询
现在来讨论一下:WHERE条件。
Where条件对from子句产生的数据进行筛选,挑出那些要放到结果集中的记录行。在这里需要提到一点的是:一种提高客户/服务器数据库性能的有效途径是:让数据库引擎来完成筛选数据的工作,而不要让应用程序来过滤那些无用的数据。然而,如果数据库的设计使得需要在where子句中使用函数来定位记录行,这些函数就会严重的降低查询的性能,因为对每一行记录都必须进行函数的计算。
还有一点就是:对于数据库查找而言,证明一个记录行满足条件,要比消除每个不满足条件的记录行要快得多。所以,将否定的where条件改写为肯定的条件将会提高性能,这是一个必须记住的准则。
1.       使用Between查找条件
Between查找条件用于测试给定的值是否在一个指定的范围之内,这个范围是包含了条件中限定起止范围的那两个值在内的,但有些人可能未意识到这一点。
Between查找条件经常与日期在一起使用。下面的例子代码就是用于查找在2006年5月期间所发生的全部活动:
SELECT Code, DateBegin
FROM dbo.Event
WHERE DateBegin BETWEEN ‘06/05/01’ AND ‘06/05/31’
2.       使用IN查找条件
IN查找条件类似于“=”比较运算符,它们的不同之处在于:IN查找条件是在一个列表中查找与给定值精确匹配的值。如果能够在列表中找到给定的值,比较的结果就为真。如:
SELECT BaseCampName
FROM dbo.BaseCamp
WHERE Region IN(‘NC’,’WV’)
实际上,IN查找条件等价于多个用“or”连接在一起的等值比较。即:
SELECT BaseCampName
FROM dbo.BaseCamp
WHERE Region=’NC’ OR
        Region=’WV’
IN运算符可以与NOT配合使用以排除特定的行。如:
SELECT BaseCampName
FROM dbo.BaseCamp
WHERE Region NOT IN(‘NC’,’SC’)
但是,证明否定条件的难度较大,尤其当涉及到空值的时候更是如此。因为空值的含义是“未知”,所以,我们无法排除要查找的值包含在列表中的可能性。下面的例子代码展示了当列表中包含空值的时候,是不可能证明‘A’不在这个列表中的:
SELECT ‘IN’ WHERE ‘A’ NOT IN(‘B’,NULL)
这个不会返回任何结果,因为条件中的那个我们不知道的空值也许就是‘A’。也正是由于SQL不能在逻辑上证明‘A’不再这个列表中,where子句返回了假值。每当将not in条件与含有空值的列表在一起使用时,where条件对于每个记录行的筛选结果都是假值。
3.       使用LIKE查找条件
LIKE查找条件使用通配符在字符串内查找指定的模式。如:
查找所有以“air”开头的任意长度的字符串(air后面可以跟任意多个字符):
SELECT ProductName
FROM dbo.Product
WHERE ProductName LIKE ‘Air%’
查询以a到d之间的字符(即a、b、c和d)打头的任意长度的产品名称:
SELECT ProductName
FROM Product
WHERE ProductName LIKE ‘[a-d]%’
要查找包含通配符的模式,可以使用两种方法:①将要查找的通配符永方括号括起来,或者在它的前面加一个转义符;②应当在like表达式内定义转义符。如:
下面的两个例子都是在product表中查找短语“F-15”。第一个查询使用方括号括住了-(在正常情况下是一个通配符);而第二个查询则使用&作为转义符:
   SELECT Code, ProductName
   FROM Product
   WHERE ProductName LIKE ‘%F[-]15%’
 
   SELECT Code,ProductName
   FROM Product
   WHERE ProductName LIKE ‘%F&-15%’ ESCAPE ‘&’
上述两个查询都会返回同样的结果集。
警告:⑴在这两种查找包含通配符的模式的方法中,使用方括号的方法是T-SQL专有的,它不符合ANSI的SQL标准。而转义的方法则是符合SQL标准的,因而也是可以移植的。
               ⑵虽然like运算符非常有用,但它会对性能造成影响。在索引中,主要是利用索引列中数据的开头部分(而不是中间的某些部分)来对索引的键值排序的。如果发现你的应用程序需要频繁地使用like运算符,就应该启用全文索引,这是一种功能强大的索引方法,它甚至考虑到单词的加权值,以及它们的不同变体,并可以用表的形式来返回分级的结果集,以便于进行连接操作。
4.       使用多个WHERE条件
可以在where子句中使用布尔逻辑运算符:and、or和not将多个where条件组合为一个复杂的where条件。其优先级顺序是:and的最高,or次之,not的优先级最低。试比较:
     SELECT Code, ProductName
     FROM dbo.Product
     WHERE ProductName LIKE ‘Air%’ OR
            Code BETWEEN ‘1018’ AND ‘1020’ AND
            ProductName LIKE ‘%G%’
   执行结果: code                        ProductName
             --------------------------       -------------------------------------------------
             1009                             Air Writer 36
             1010                             Air Writer 48
             1011                             Air Writer 66
             1019                             Grand Daddy
             1020                             Black Ghost
     SELECT Code, ProductName
     FROM dbo.Product
     WHERE (ProductName LIKE ‘Air%’ OR
            Code BETWEEN ‘1018’ AND ‘1020’) AND
            ProductName LIKE ‘%G%’
      执行结果: code                        ProductName
             --------------------------       -------------------------------------------------
1019                                        Grand Daddy
1020                                        Black Ghost
虽然上面这两个查询非常的相似,但在第一个查询中采用的是布尔运算符的正常优先级,这就决定了and要在or之前进行运算,正是or将Air Writes包含进了结果集中。第二个查询使用括号明确的改变了布尔运算符的优先级顺序。Or筛选出了Code为1018、1019和1020的产品以及名字以Air打头的产品(Air Writes)。然后,and运算符检查这些产品名字中是否含有字母g。最后,只有Code为1019和1020的产品能够满足以上的全部条件。
说明:在编写复杂的布尔或者数学表达式时,使用括号或者详尽的代码来明确地指出你的意图,将会减少由于必须猜测你的意图而造成的误解和错误。
5.       Select…Where
令人惊讶的是:在select语句中使用where子句时并非一定要有from子句,或者引用任何的表。没有from子句的select语句只会返回一行记录:
      SELECT ‘ABC’
执行结果:ABC
在没有from子句的select语句中使用where子句,将对整个select语句加以限定。如果where条件为真,就会如你所愿地执行select语句:
   SELECT ‘ABC’ WHERE 1>0
执行结果:ABC
如果where条件为假,将不会执行select语句:
   DECLARE @test NVARCHAR(15)
      SET @test=’z’
SELECT @test=’ABC’ WHERE 1<0
SELECT @test
执行结果:z
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

【SQLServer】T-SQL查询学习总结(2)[基础知识]

PS:这是是学习微软官方教程 《技术内幕 T-SQL查询》的笔记,样例数据库可以到这里下载。因为是自己作总计笔记之用,查资料的学习的同学注意,很可能对你没有帮助。 以下全文引用的是同一个...

T-SQL语句之Select(一)

Operator Description != Tests two expressions not being equal to each other. ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)