where子句在下面的示例中是如何工作的?

cmssoen2  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(230)

我很难理解以下代码:

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.buyPrice 反对 a.buyPrice ? 3. WHERE 1 = (SELECT... 这是什么意思 1 在这一点上?

yzuktlbb

yzuktlbb1#

该查询将为您提供价格第二高的产品,包括领带。
相关子查询统计同一个表中有多少行的价格高于当前行的价格(需要为1)。
如果不涉及任何关系,您可以使用行限制查询来表达:

select *
from products
order by buyPrice desc
limit 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
dkqlctbz

dkqlctbz2#

句子中的“谓语” WHERE 对于表中第二贵的产品,子句的计算结果为真。
它使用一个“相关子查询”,对于每一行,找到比当前行更贵的所有产品,然后对它们进行计数;这就是相关子查询的工作方式。 predicate 验证此计数是否完全正确 1 .
如果您注意到该表被使用了两次,但是使用了不同的别名 a 以及 b 以准确参考比较结果。

相关问题