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

本文深入介绍了SQL中的WHERE子句,用于在SELECT语句中指定搜索条件过滤数据。内容包括相等、不等、范围值及NULL值的检查,展示了如何利用BETWEEN、IS NULL等操作符进行高效的数据筛选。强调了WHERE子句在数据库性能和应用效率方面的重要性。
摘要由CSDN通过智能技术生成


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

一、使用 WHERE 子句

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

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

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

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

prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.49
Bird bean bag toy       3.49
Rabbit bean bag toy     3.49

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

提示:有多少个 0?

你在练习这个示例时,会发现显示的结果可能是 3.49、3.490、3.4900 等。出现这样的情况,往往是因为 DBMS 指定了所使用的数据类型及其默认行为。

所以,如果你的输出可能与本文中的有点不同,不必焦虑,毕竟从数学角度讲,3.49 和 3.4900 是一样的。

提示:SQL 过滤与应用过滤

数据也可以在应用层过滤。为此,SQL 的 SELECT 语句为客户端应用检索出超过实际所需的数据,然后客户端代码对返回数据进行循环,提取出需要的行。

通常,这种做法极其不妥。优化数据库后可以更快速有效地对数据进行过滤。

而让客户端应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性。

此外,如果在客户端过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费。

注意:WHERE 子句的位置

在同时使用 ORDER BYWHERE 子句时,应该让 ORDER BY 位于 WHERE 之后,否则将会产生错误(关于 ORDER BY 的使用,请参阅 如何使用 ORDER BY 根据需要排序检索出的数据)。

二、WHERE 子句操作符

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

表 1 WHERE 子句操作符

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

注意:操作符兼容

表 1 中列出的某些操作符是冗余的(如 <>!= 相同,!< 相当于 >=)。并非所有 DBMS 都支持这些操作符。想确定你的 DBMS 支持哪些操作符,请参阅相应的文档。

2.1 检查单个值

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

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

SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 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 元的产品,所以结果与前一个例子相同):

SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;

2.2 不匹配检查

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

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

输出:

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

提示:何时使用引号

如果仔细观察上述 WHERE 子句中的条件,会看到有的值括在单引号内,而有的值未括起来。单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。

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

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

注意:是 != 还是 <>

!=<> 通常可以互换。但是,并非所有 DBMS 都支持这两种不等于操作符。如果有疑问,请参阅相应的 DBMS 文档。

2.3 范围值检查

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

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

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

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

输出:

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

无值(no value),它与字段包含 0、空字符串或仅仅包含空格不同。

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

SELECT prod_name
FROM Products
WHERE prod_price IS NULL;

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

SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;

输出:

cust_name
----------
Kids Place
The Toy Store

提示:DBMS 特有的操作符

许多 DBMS 扩展了标准的操作符集,提供了更高级的过滤选择。更多信息请参阅相应的 DBMS 文档。

注意:NULL 和非匹配

通过过滤选择不包含指定值的所有行时,你可能希望返回含 NULL 值的行。但是这做不到。因为 NULL 比较特殊,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。

三、小结

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

原文链接:https://www.developerastrid.com/sql/sql-where/

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值