四时宝库

程序员的知识宝库

MSSQL WHERE 子句,了解一点是一点

WHERE 是条件筛选 FROM 子句的输出结果并限制结果集中返回的行。其条件可以是当前查询表中的数据、表达式、SQL 内置的标量函数、以及自定定义的函数,或者其他子查询。

WHERE 条件还可以利用比较运算符和通配符。比如 大于(>),等于(=),小于(<),不等于(<>,!=)等等。此外,也还可以使用布尔运算符 AND OR NOT 等组合多个查询条件。

当然,还有 BETWEEN,IN,LIKE,IS 这4个特殊的比较运算符。

其中!= 这个比较符 不是 ANSI标准的SQL。<>可移植,!=不可以

一种能提高客户端/服务器数据库性能的方法是,让查询限制返回的行,而不是使客户端应用程序费力地读取不必要的数据。其次,找到数据的最好方法是查找,而不是排除,比如我们在一堆积木中找一个红色的方形木块,不是排除不是红色和方形的木块。排除没有精确查找快,数据的查询也是一样的。证明某一行符合条件远快于先排除所有不满足该条件的行。

一般来说(但不总是),将否定的WHERE条件变为肯定的条件可改善性能。

下面的语句,假设Col1为索引列

SELECT Col2,Col3 FROM Table WHERE Col1+30=130

上面的语句将进行不必要的扫描,读取每一行,模拟修改了每一行,然后再与130做比较

其实可以这样写:

SELECT Col2,Col3 FROM Table WHERE Col1=130-30

这样,SQL SERVER 可以计算130-30并在Col1中快速索引查找具有 100 的行。这只是个简单的例子,但是原理是正确的。编写 WHERE 子句的方式会显著影响查询性能。所有尽量减少在列中计算。

NULL值,NULL值如果做为查询参数来证明否定其实是比较难得,因为NULL值的含义是 “未知”,正在搜索的值可能存在于列表中。如下面的语句说明了列表中的null值如何使得无法证明 ‘A’不在列表内:

SELECT 'IN' WHERE 'A' NOT IN ('B',NULL);

执行出来的结果是没有值,因为未知的 NULL 值可能是 'A'。由于SQL 不能从逻辑上证明 ‘A’不在列表中,因此 WHERE 子句返回的是false,对于 否定(NOT IN)条件来说,如果列表中有null值,则每行都将被判定为 false。

LIKE 通配符 % 如 'Abc' LIKE 'A%',查找 A打头的数据

_ 如 'Abc' LIKE 'Ab_', Ab打头后面任意1个字符,其中_代表1个任意字符,两个__代表2个任意字符:

SELECT 'Abc' WHERE 'Abc' LIKE 'Ab_' /*有值返回*/
SELECT 'Abc' WHERE 'Abcd' LIKE 'Ab__' /*有值返回*/

[],如 'A' LIKE '[a-b]' 这是范围,在 a和b之间,也包括a和b自己本身,

 SELECT 'Abc' WHERE 'a' LIKE '[a-b]' /*有值返回*/

[^] 如 'A' LIKE [^W-Z] 这跟上一句是相反的

 SELECT 'Abc' WHERE 'a' LIKE '[^w-z]' /*有值返回*/

虽然LIKE运算符在与范围匹配很实用,但是它会影响性能。如果在实际应用中需要频繁使用LIKE,不妨了解下 全文索引。我们平常数据设计的索引都是在列的开头部分,而不是列的中间部分,全文索引 考虑到了加权值和词尾变化,并且可以以表的形式返回结果集以供联接。

一个WHERE 子句后面如果有多个运算符,那需要注意执行顺序 如我们有如下数据行

UserName:LI
UserName:	LI HANS

User DataBase
SELECT UserID,UserName FROM dbo.User
WHERE
 Name Like 'LI%'
OR
UserID BETWWEN 1 AND 2
AND
Name LIKE ‘%S%’

和带上括号

User DataBase
SELECT UserID,UserName FROM dbo.User
WHERE
( Name Like 'LI%'
OR
UserID BETWWEN 1 AND 2
)
AND
Name LIKE ‘%S%’

想想这两个执行结果是不是一样的。

布尔逻辑运算符合加减乘除一样,也有执行顺序:首先是NOT,其次是AND,最后是OR。我们加上括号就可以明确我们的运算符执行的顺序。

SELECT * 号,星号是特殊通配符,它按照表顺序包括所有的列,这里的顺序是指联接多表时,会按照联接的顺序把所有表的列都查询出来。

星号查询很方便,但是在实际项目中,不要使用*。它会浪费资源,在大多数情况下,会返回超出需求的数据。且,*号的可读性很差,不知道在查询中实际需要用到的是哪些列。

声明,我只是个搬运工,这些技术知识网上,书本上有很多。感兴趣的可以去百度。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接