【问题标题】:How the WHERE clause works in the following instance?WHERE 子句在以下实例中如何工作?
【发布时间】:2020-09-26 20:50:33
【问题描述】:

我很难理解以下代码:

SELECT
    productCode, productName, buyPrice
FROM
    products a
WHERE
    1 =
        (
        SELECT COUNT(productCode)
        FROM products b
        WHERE b.buyPrice > a.buyPrice
        );

特别是这部分:

WHERE
    1 =
        (
        SELECT COUNT(productCode)
        FROM products b
        WHERE b.buyPrice > a.buyPrice # descending order
        );

问题: 1.语句中的选择过程是什么? 2.WHERE b.buyPrice > a.buyPrice如何匹配行b.buyPricea.buyPrice? 3.WHERE 1 = (SELECT...此时1是什么意思?

【问题讨论】:

    标签: mysql sql select count where-clause


    【解决方案1】:

    该查询为您提供价格第二高的产品,包括领带。

    相关子查询计算同一张表中有多少行的价格高于当前行的价格 - 需要为 1。

    如果不涉及任何关系,您可以使用限制行的查询来表达这一点:

    select *
    from products
    order by buyPrice desc
    limit 1, 1
    

    但这不能正确处理关系。另请注意,查询并未正确管理最高价格:如果有超过 1 种产品的最高价格,您的查询将显示为空,这可能不是您想要的。

    在支持窗口函数的 MySQL 8.0 中,您可以使用 dense_rank() 更轻松、更安全地表达这一点:

    select *
    from (
        select p.*, dense_rank() over(order by buyPrice desc) rn
        from products p
    ) p
    where rn = 2
    

    【讨论】:

    • 感谢您的回答并指出原始查询中的缺陷。检查了两个最高价格,dense_rank() 在这种情况下非常适合。
    【解决方案2】:

    WHERE 子句中的“谓词”对于表中第二昂贵的产品将评估为真。

    它使用“相关子查询”——对于每一行——找出所有比当前行更贵的产品,然后计算它们;这就是相关子查询的工作方式。谓词验证此计数正好是 1

    如果您注意到该表被使用了两次,但使用不同的别名 ab 以准确引用比较。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多