使用 WHERE 子句
数据库表一般包含大量的数据,很少需要检索表中所有行。通常只
会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要
指定搜索条件(search criteria),搜索条件也称为过滤条件(filter
condition)。
在 SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤。
WHERE 子句在表名( FROM 子句)之后给出,
这条语句从 products 表中检索两个列,但不返回所有行,只返
回 prod_price 值为 2.50 的行
这个例子采用了简单的相等测试:它检查一个列是否具有指定的值,
据此进行过滤。但是SQL允许做的事情不仅仅是相等测试
SQL过滤与应用过滤 数据也可以在应用层过滤。为此目
的,SQL的 SELECT 语句为客户机应用检索出超过实际所需的
数据,然后客户机代码对返回数据进行循环,以提取出需要
的行。
通常,这种实现并不令人满意。因此,对数据库进行了优化,
以便快速有效地对数据进行过滤。让客户机应用(或开发语言)
处理数据库的工作将会极大地影响应用的性能,并且使所创建
的应用完全不具备可伸缩性。此外,如果在客户机上过滤数据,
服务器不得不通过网络发送多余的数据,这将导致网络带宽的
浪费。
WHERE 子句的位置 在同时使用 ORDER BY 和 WHERE 子句时,应
该让 ORDER BY 位于 WHERE 之后,否则将会产生错误
WHERE 子句操作符
我们在关于相等的测试时看到了第一个 WHERE 子句,它确定一个列是
否包含特定的值。MySQL支持表6-1列出的所有条件操作符
不匹配检查
以下例子列出不是由供应商 1003 制造的所有产品
何时使用引号单引号用来限定字符串。如果将值与串类型的
列进行比较,则需要限定引号。用来与数值列进行比较的值不
用引号。
范围值检查
为了检查某个范围的值,可使用 BETWEEN 操作符。其语法与其他 WHERE
子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。
例如, BETWEEN 操作符可用来检索价格在5美元和10美元之间或日期在指
定的开始日期和结束日期之间的所有产品
下面的例子说明如何使用 BETWEEN 操作符,它检索价格在5美元和10
美元之间的所有产品
从这个例子中可以看到,在使用 BETWEEN 时,必须指定两个值
——所需范围的低端值和高端值。这两个值必须用 AND 关键字
分隔。 BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值
空值检查
在创建表时,表设计人员可以指定其中的列是否可以不包含值。在
一个列不包含值时,称其为包含空值 NULL
NULL 无值(no value),它与字段包含 0 、空字符串或仅仅包含
空格不同
SELECT 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 值的列。
这个 WHERE 子句就是 IS NULL 子句。其语法如下:
这条语句返回没有价格(空 prod_price 字段,不是价格为 0 )的所有
产品,由于表中没有这样的行,所以没有返回数据
NULL 与不匹配 在通过过滤选择出不具有特定值的行时,你
可能希望返回具有 NULL 值的行。但是,不行。因为未知具有
特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤
或不匹配过滤时不返回它们。
因此,在过滤数据时,一定要验证返回数据中确实给出了被
过滤列具有 NULL 的行。
本章介绍了如何用 SELECT 语句的 WHERE 子句过滤返回的数据。我们学
习了如何对相等、不相等、大于、小于、值的范围以及 NULL 值等进行测
试。