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 * 号,星号是特殊通配符,它按照表顺序包括所有的列,这里的顺序是指联接多表时,会按照联接的顺序把所有表的列都查询出来。
星号查询很方便,但是在实际项目中,不要使用*。它会浪费资源,在大多数情况下,会返回超出需求的数据。且,*号的可读性很差,不知道在查询中实际需要用到的是哪些列。
声明,我只是个搬运工,这些技术知识网上,书本上有很多。感兴趣的可以去百度。