第4课 过滤数据
这一课将讲授如何使用SELECT语句的WHERE子句指定搜索条件。我们学习了如何检验相等、不相等、大于、小于、值的范围以及NULL值等。
4.1 使用WHERE子句
只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表中(FROM子句)之后给出。
注意:
WHERE子句的位置在同时使用
ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。
4.2 WHERE子句操作符
- 并非所有
DBMS都支持这些操作符。
4.2.1 检查单个值
4.2.2 不匹配检查
注意:是 != 还是 <> ?
!= 和 <>通常可以互换。但是,并非所有DBMS都支持这两种不等于操作符。
4.2.3 范围值检查
要检查某个范围的值,可以使用BETWEEN操作符。
在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分割。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
4.2.4 空值检查
表设计人员可以指定其中的列能否不包含值。
在一个列不包含值时,称其包含空值NULL。
NULL无值
no value,它与字段包含0,空字符或仅仅包含空格不同。
SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。
注意:
NULL和非匹配过滤数据时,一定要验证被过滤列中含
NULL的行确实出现在返回的数据中。
4.3 小结
第5课 高级过滤数据
讲授如何组合WHERE子句以建立功能更强、更高级的搜索条件。
讲授了如何使用AND和OR操作度组合成WHERE子句。
讲授了如何明确地管理求值顺序,如何使用NOT和IN操作符。
5.1 组合WHERE子句
SQL允许给出多个WHERE子句。这些子句有两种使用方式,即以AND子句或OR子句的方式使用。
操作符
operator:用来联结或改变
WHERE子句中的子句的关键字,也称为逻辑操作符logical operator。
5.1.1 AND操作符
要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。AND指示DBMS只返回满足所有给定条件的行。
- 可以增加多个过滤条件,每个条件间都要使用
AND关键字。
5.1.2 OR操作符
许多DBMS在OR WHERE子句的第一个条件得到满足的情况下,就不再计算第二个条件了。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。
5.1.3 求值顺序
WHERE子句可以包含任意数目的AND和OR操作符。允许两者结合以进行复杂、高级的过滤。
提示:在
WHERE子句中使用圆括号任何时候使用具有
AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。
5.2 IN操作符
IN操作符用来指定条件范围,范围中的每一个条件都可以进行匹配。IN取一组由逗号分割、括在圆括号中的合法值。IN操作符完成了与OR相同的功能。
为什么要使用IN操作符呢?
-
在有很多合法选项时,
IN操作符的语法更清楚,更直观。 -
在与其他
AND和OR操作符组合使用IN时,求值顺序更容易管理。 -
IN操作符一般比一组
OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。 -
IN的最大优点是可以包含其他
SELECT语句,能够更动态地建立WHERE子句。
5.3 NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。NOT关键字可以用在要过滤的列前,而不仅是在其后。
说明:
MariaDB中的NOT
MariaDB支持使用NOT否定IN、BETWEEN和EXIST子句。大多数DBMS允许使用NOT否定任何条件。
第6课 用通配符进行过滤
这一课介绍什么是通配符、如何在WHERE子句中使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤。还说明了通配符应该细心使用,不要使用过度。
6.1 LIKE操作符
利用通配符,可以创建比较特定数据的搜索模式。
通配符
wildcard用来匹配值的一部分的特殊字符。
搜索模式
search pattern由字面值、通配符或两者组合构成的搜索条件。
通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。
谓词predicate操作符何时不是操作符?答案是,它作为谓词时。从技术上说,
LIKE是谓词而不是操作符。
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
6.1.1 百分号%通配符
在搜索串中,%表示任何字符出现任意次数。
说明:区分大小写
根据
DBMS的不同及其配置,搜索可以是区分大小写的。例如,‘%fish%’。匹配不到’daFishdad’。
- 通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。
说明:请注意后面所跟的空格
包括
Access在内的许多DBMS都用空格来填补字段的内容。简单的解决方案是给搜索模式再增加一个%号:'F%y%'还匹配y后面的空格。更好的解决办法是用函数去掉空格。注意:请注意
NULL通配符%看起来像是可以匹配任何东西,但有个例外,这就是
NULL。子句WHERE prod_name LIKE '%'不会匹配产品名称为NULL的行。
6.1.2 下划线_通配符
下划线的用途与%一样,但它只匹配单个字符,而不是多个字符。
说明:
DB2通配符DB2不支持通配符_。
说明:
Access通配符如果使用的是
Microsoft Access,需要使用?而不是_。
6.1.3 方括号[]通配符
方括号通配符用来制定一个字符集。它必须匹配指定位置的一个字符。
说明:并不总是支持集合
与前面描述的通配符不一样,并不是所有
DBMS都支持用来创建集合的[]。只有微软的Access和SQL Server支持集合。为确定你使用的DBMS是否支持集合,请参阅相应的文档。
[JM]匹配方括号中任意一个字符,它也只能匹配单个字符。- 此通配符可以用前缀字符
^脱字号来否定。
说明:
Access中的否定集合如果使用的是
Microsoft Access,需要用!而不是^来否定一个集合,因此,使用的是[!JM]而不是[^JM]。
- 可以使用
NOT操作符得出类似的结果。^的唯一优点是在使用多个WHERE子句时可以简化语法。
6.2 使用通配符的技巧
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。