如何使用 SQL WHERE 过滤返回的数据

本文介绍如何使用 SQL WHERE 子句指定搜索条件,过滤返回的数据。还介绍如何检验相等、不相等、大于、小于、值的范围以及 NULL 值等。

一、使用 WHERE 子句

数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。

SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤。WHERE 子句在表名(FROM 子句)之后给出,如下所示:

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

这条语句从 products 表中检索两个列,但不返回所有行,只返回 prod_price 值为 3.49 的行,如下所示:

1
2
3
4
5
prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.49
Bird bean bag toy       3.49
Rabbit bean bag toy     3.49

这个示例使用了简单的相等检验:检查这一列的值是否为指定值,据此过滤数据。不过,SQL 不只能测试等于,还能做更多的事情。

二、WHERE 子句操作符

我们在做相等检验时看到了第一个 WHERE 子句,它确定一个列是否包含指定的值。SQL 支持表 1 列出的所有条件操作符。

表 1 WHERE 子句操作符

操作符说明
=等于
<>不等于
!=不等于
<小于
<=小于等于
!<不小于
>大于
>=大于等于
!>不大于
BETWEEN在指定的两个值之间
IS NULLNULL

2.1 检查单个值

我们已经看到了检验相等的例子,现在来看看几个使用其他操作符的例子。

第一个例子是列出所有价格小于 10 元的产品。

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;

输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.49
Bird bean bag toy       3.49
Rabbit bean bag toy     3.49
8 inch teddy bear       5.99
12 inch teddy bear      8.99
Raggedy Ann             4.99
King doll               9.49
Queen doll              9.49

下一条语句检索所有价格小于等于 10 元的产品(因为没有价格恰好是 10 元的产品,所以结果与前一个例子相同):

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;

2.2 不匹配检查

这个例子列出所有不是供应商 DLL01 制造的产品:

1
2
3
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';

输出:

1
2
3
4
5
6
7
vend_id        prod_name
----------     ------------------
BRS01          8 inch teddy bear
BRS01          12 inch teddy bear
BRS01          18 inch teddy bear
FNG01          King doll
FNG01          Queen doll

下面是相同的例子,其中使用 != 而不是 <> 操作符:

1
2
3
SELECT vend_id, prod_name
FROM Products
WHERE vend_id != 'DLL01';

2.3 范围值检查

要检查某个范围的值,可以使用 BETWEEN 操作符。其语法与其他 WHERE 子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。

例如,BETWEEN 操作符可用来检索价格在 5 元和 10 元之间的所有产品,或在指定的开始日期和结束日期之间的所有日期。

下面的例子说明如何使用 BETWEEN 操作符,它检索价格在 5 元和 10 元之间的所有产品。

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;

输出:

1
2
3
4
5
6
prod_name               prod_price
-------------------     ----------
8 inch teddy bear       5.99
12 inch teddy bear      8.99
King doll               9.49
Queen doll              9.49

从这个例子可以看到,在使用 BETWEEN 时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用 AND 关键字分隔。BETWEEN 匹配范围中所有的值,包括指定的开始值和结束值。

2.4 空值检查

在创建表时,表设计人员可以指定其中的列能否不包含值。在一个列不包含值时,称其包含空值 NULL

确定值是否为 NULL,不能简单地检查是否等于 NULLSELECT 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 值的列。这个 WHERE 子句就是 IS NULL 子句。其语法如下:

1
2
3
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;

这条语句返回所有没有价格(空 prod_price 字段,不是价格为 0)的产品,由于表中没有这样的行,所以没有返回数据。但是,Customers 表确实包含具有 NULL 值的列:如果没有电子邮件地址,则 cust_email 列将包含 NULL 值:

1
2
3
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;

输出:

1
2
3
4
cust_name
----------
Kids Place
The Toy Store

三、小结

本文介绍了如何用 SELECT 语句的 WHERE 子句过滤返回的数据。还介绍了如何检验相等、不相等、大于、小于、值的范围以及 NULL 值等。

(完)