《SQL必知必会》| 第4-6课 过滤数据 学习笔记
第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 使用通配符的技巧
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。