• SQL必需掌握的100个重要知识点:组合 WHERE 子句


    第 4课介绍的所有 WHERE 子句在过滤数据时使用的都是单一的条件。为
    了进行更强的过滤控制,SQL允许给出多个 WHERE 子句。这些子句有两
    种使用方式,即以 AND 子句或 OR 子句的方式使用。
    操作符(operator)
    用来联结或改变 WHERE 子句中的子句的关键字,也称为逻辑操作符
    (logical operator)。
    5.1.1  AND 操作符
    要通过不止一个列进行过滤,可以使用 AND 操作符给 WHERE 子句附加条
    件。下面的代码给出了一个例子:
    输入▼
    SELECT prod_id, prod_price, prod_name

    FROM Products
    WHERE vend_id = 'DLL01' AND prod_price <= 4;
    分析▼
    此SQL语句检索由供应商 DLL01 制造且价格小于等于4美元的所有产品
    的名称和价格。这条 SELECT 语句中的 WHERE 子句包含两个条件,用 AND
    关键字联结在一起。 AND 指示 DBMS只返回满足所有给定条件的行。如
    果某个产品由供应商 DLL01 制造,但价格高于 4美元,则不检索它。类
    似地,如果产品价格小于 4 美元,但不是由指定供应商制造的也不被检
    索。这条 SQL语句产生的输出如下:
    输出▼
    prod_id prod_price prod_name
    ------- ---------- --------------------
    BNBG02 3.4900 Bird bean bag toy
    BNBG01 3.4900 Fish bean bag toy
    BNBG03 3.4900 Rabbit bean bag toy
    AND
    用在 WHERE 子句中的关键字,用来指示检索满足所有给定条件的行。
    这个例子只包含一个 AND 子句,因此只有两个过滤条件。可以增加多个
    过滤条件,每个条件间都要使用 AND 关键字。
    说明:没有 ORDER BY 子句
    为了节省空间,也为了减少你的输入,我在很多例子里省略了 ORDER
    BY 子句。因此,你的输出完全有可能与书上的输出不一致。虽然返回
    行的数量总是对的,但它们的顺序可能不同。当然,如果你愿意也可
    以加上一个 ORDER BY 子句,它应该放在 WHERE 子句之后。

    5.1.2  OR 操作符
    OR 操作符与 AND 操作符正好相反,它指示 DBMS 检索匹配任一条件的
    行。事实上,许多 DBMS在 OR WHERE 子句的第一个条件得到满足的情
    况下,就不再计算第二个条件了(在第一个条件满足时,不管第二个条
    件是否满足,相应的行都将被检索出来)。
    请看如下的 SELECT 语句:
    输入▼
    SELECT prod_id, prod_price, prod_name
    FROM Products
    WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
    分析▼
    此 SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。
    OR 操作符告诉 DBMS 匹配任一条件而不是同时匹配两个条件。如果
    这里使用的是 AND 操作符,则没有数据返回(因为会创建没有匹配行的
    WHERE 子句)。这条 SQL语句产生的输出如下:
    输出▼
    prod_name prod_price
    ------------------- ----------
    Fish bean bag toy 3.4900
    Bird bean bag toy 3.4900
    Rabbit bean bag toy 3.4900
    8 inch teddy bear 5.9900
    12 inch teddy bear 8.9900
    18 inch teddy bear 11.9900
    Raggedy Ann 4.9900
    OR
    WHERE 子句中使用的关键字,用来表示检索匹配任一给定条件的行。

    5.1.3 求值顺序
    WHERE 子句可以包含任意数目的 AND 和 OR 操作符。允许两者结合以进
    行复杂、高级的过滤。
    但是,组合 AND 和 OR 会带来了一个有趣的问题。为了说明这个问题,
    来看一个例子。假如需要列出价格为10美元及以上,且由 DLL01 或 BRS01
    制造的所有产品。下面的 SELECT 语句使用组合的 AND 和 OR 操作符建立
    了一个 WHERE 子句:
    输入▼
    SELECT prod_name, prod_price
    FROM Products
    WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
    AND prod_price >= 10;
    输出▼
    prod_name prod_price
    ------------------- ----------
    Fish bean bag toy 3.4900
    Bird bean bag toy 3.4900
    Rabbit bean bag toy 3.4900
    18 inch teddy bear 11.9900
    Raggedy Ann 4.9900
    分析▼
    请看上面的结果。返回的行中有 4 行价格小于 10 美元,显然,返回的行
    未按预期的进行过滤。为什么会这样呢?原因在于求值的顺序。SQL(像
    多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。当 SQL看到
    上述 WHERE 子句时,它理解为:由供应商 BRS01 制造的价格为 10美元以
    上的所有产品,以及由供应商 DLL01 制造的所有产品,而不管其价格如何。
    换句话说,由于 AND 在求值过程中优先级更高,操作符被错误地组合了。

    此问题的解决方法是使用圆括号对操作符进行明确分组。请看下面的
    SELECT 语句及输出:
    输入▼
    SELECT prod_name, prod_price
    FROM Products
    WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
    AND prod_price >= 10;
    输出▼
    prod_name prod_price
    ------------------- ----------
    18 inch teddy bear 11.9900
    分析▼
    这条 SELECT 语句与前一条的唯一差别是,将前两个条件用圆括号括了起
    来。因为圆括号具有比 AND 或 OR 操作符更高的优先级,所以 DBMS首先
    过滤圆括号内的 OR 条件。这时,SQL 语句变成了选择由供应商 DLL01
    或 BRS01 制造的且价格在 10 美元及以上的所有产品,这正是我们希望
    的结果。
    提示:在 WHERE 子句中使用圆括号
    任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括
    号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你
    希望的那样。使用圆括号没有什么坏处,它能消除歧义。

  • 相关阅读:
    PaO2/FiO2在临床中的应用 氧合指数
    lvs负载均衡之配置lvs-tun模式的httpd负载集群
    ClickHouse的Join算法
    架构学习——Redis内存数据库学习要点
    Python中的异常处理以及自定义异常类型
    借助ChatGPT使用Python搭建一个工具网站
    红黑树封装实现map和set
    软件设计模式(二):工厂、门面、调停者和装饰器模式
    全量数据采集:不同网站的方法与挑战
    13、用户web层服务(一)
  • 原文地址:https://blog.csdn.net/tysonchiu/article/details/125486219