如何使用 SQL WHERE 过滤返回的数据「终于解决」

如何使用 SQL WHERE 过滤返回的数据「终于解决」本文介绍如何使用 SQL WHERE 子句指定搜索条件,过滤返回的数据。还介绍如何检验相等、不相等、大于、小于、值的范围以及 NULL 值等。 一、使用 WHERE 子句 数据库表一般包含大量的数据,

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

目录
  • 一、使用 WHERE 子句
  • 二、WHERE 子句操作符
    • 2.1 检查单个值
    • 2.2 不匹配检查
    • 2.3 范围值检查
    • 2.4 空值检查
  • 三、小结

本文介绍如何使用 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 NULL NULL

注意:操作符兼容

表 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

(完)

原文地址:https://www.cnblogs.com/vin-c/archive/2022/04/26/16195006.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5339.html

(0)
上一篇 2023-05-13
下一篇 2023-05-13

相关推荐

  • redis 订阅发布 可靠吗_redis项目

    redis 订阅发布 可靠吗_redis项目(第8章 发布订阅与事务) 前言 参考资料:《Redis设计与实现 第二版》; 第三部分为独立功能的实现,主要由以下模块组成:发布订阅、事务、Lua 脚本、排序、二进制位数组、慢查询日志、监视器; 本

    2023-04-30
    149
  • Python函数参数默认值错误

    Python函数参数默认值错误Python函数的参数默认值是指在定义函数时为某些参数设置的一个默认值,这样在函数调用时如果没有给这些参数传值,就会使用默认值。在Python中,默认参数是通过在参数名后面加上=和默认值来定义的。例如:

    2024-03-04
    80
  • 高性能mysql 索引_mysql添加索引命令

    高性能mysql 索引_mysql添加索引命令参考《高性能MySQL》第3版 1 索引基础 1.1 索引作用 在MySQL中,查找数据时先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行,假如要运行下面查询语句: 如果在uid在建有索

    2023-05-11
    131
  • 数据中台技术架构方案v2.5_nginx模块开发与架构解析

    数据中台技术架构方案v2.5_nginx模块开发与架构解析回顾一下,第一篇文章 "大白话 六问数据中台!你想知道的都在这了!" 。把数据中台是什么?为什么?有什么价值?说的明明白白。 数据中台是企业级能力复用平台,目标是让数据持续用起来,

    2023-03-01
    154
  • sql按时间戳查询_js日期转时间戳

    sql按时间戳查询_js日期转时间戳需求:有一张域名浏览记录表,有字段warning浏览次数,字段updatetime创建时间,现在需要获取,按创建时间的降序,浏览量的降序,获取域名列表。就是说,同一天创建的域名,如果谁的浏览量大,谁就

    2023-03-12
    145
  • 使用MongoDB创建新用户

    使用MongoDB创建新用户MongoDB是一个基于分布式文件存储的数据库,在互联网应用中很广泛地被使用,它在很多方面比传统关系型数据库更适合处理海量数据。本文将为大家介绍如何使用MongoDB创建新用户,让您更好地运用MongoDB进行数据管理。

    2024-07-08
    39
  • 分库分表很常见,但这些问题90%的人都答不全[通俗易懂]

    分库分表很常见,但这些问题90%的人都答不全[通俗易懂]分库分表,是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案,也是一个非常高频的面试题。但是,因为很多人其实并没有非常丰富的分库分表的经验,所以能把这个问题回答得比较好的人其实还挺少的

    2023-06-16
    139
  • oracle批量添加指定表前缀的索引SQL语句[通俗易懂]

    oracle批量添加指定表前缀的索引SQL语句[通俗易懂]oracle批量添加指定表前缀的索引SQL语句 需要输入用户名,表空间,索引个数,表名前缀,过滤的表名后缀 declare –用户名 userName varchar2(50) :='s…

    2023-02-27
    160

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注