【问题标题】:MySQL - Difference between two queriesMySQL - 两个查询之间的区别
【发布时间】:2012-12-13 10:24:46
【问题描述】:
(SELECT * FROM (SELECT clientid,totalquantity from clientquantity 
order by quantitydate desc) AS A GROUP BY clientid);

SELECT clientid,totalquantity from clientquantity group by clientid;

有人能解释一下上面两个查询之间的区别吗?结果集在计算的行数方面是相同的。那么,这两个查询之间有区别吗?例如,性能方面,还是数据差异?

第一个查询用作LEFT JOIN 与另一个表的查询的一部分。为了简单起见,我在这篇文章中删除了另一个表。

是上面的,因为第二个查询也需要包含一个 ORDER BY,而使用 SQL 的唯一方法就是这样做 在第一个查询中?我从第二个查询中省略了 ORDER BY 但它是 在第二个查询中也是必需的。

谢谢,

【问题讨论】:

    标签: mysql select group-by


    【解决方案1】:

    第一个查询(SELECT * FROM (SELECT clientid,totalquantity from clientquantity order by quantitydate desc) AS A GROUP BY clientid); 有(在我看来)像冗余部分。查询的最深部分(SELECT clientId,totalquantity...)从按数量日期排序的表中获取所有信息。查询的第二部分是SELECT * FROM ...,它只是说“将所有数据从内部结果集中拉到我的结果集中”。最后一部分是获取该结果集并按客户端 ID 对其进行分组。

    第二个查询SELECT clientid,totalquantity from clientquantity group by clientid; 做了几乎完全相同的事情,但更简洁:它获取 clientid 和 totalquantity 列,并按客户端 ID 对其进行分组。 唯一的区别是它不按数量日期降序排序

    在执行时,它们基本上会做同样的事情(行顺序会有所不同),但您的数据库引擎应该足够智能,以使两者具有几乎相同的性能。至于可读性,我会使用第二个查询并在 group by 语句之前添加ORDER BY quantitydate DESC,以便它与第一个执行相同的操作(当然,除非您不想对其进行排序)。

    【讨论】:

    • “有多余的部分”——如果删除会改变结果集,它们怎么可能是“多余的”?
    • "在 group by 语句之前" --- 它不会改变任何东西。如果您将 order by 放在 group by 之前 - 您将不会得到与第一个查询相同的结果。
    • 感觉可以去掉不加修改的SELECT * FROM(一个结果集)。可以说 SELECT clientid, totalquantity FROM clientquantity 然后附加分组依据和排序。当然,我可能遗漏了一些东西:p。
    • 是的,你错过了一些东西 ;-) 嵌套用于“欺骗”mysql 并为每个 clientid 组获取最大 totalquantity 值 - 因为选择中的 totalquantity 是'不在group by 或聚合函数中使用 - 将采用第一个(最大的)
    • @zerkms:它们在标准 SQL 视图中是多余的。一个体面的优化器会将ORDER BY 扔出窗口(然后两个查询都会返回同样无意义的结果。当然,标准解析器会同时抛出错误:)
    【解决方案2】:

    查看此SQL FIDDLE DEMO 以了解您的两个查询之间的区别。

    1. 当您使用按日期降序排列的数据排序时 使用 clientId 对该数据进行分组,而不是检索所有客户端数据 最新的日期。

    2. 如果您直接使用GROUP BY 子句,那么它将获取每个第一个 按 clientId 从表中记录。

    【讨论】:

    • 我只对返回的第一行感兴趣。 MYSQL 丢弃剩余的行,因此我可以获得第一行。您认为这种方法有什么问题吗?
    • 查看我的 sql fiddle 演示示例,它将让您完美了解何时使用哪个。如果你想要每一行,那么第二个查询是完美的,但如果你想要按日期最新的数据,那么你必须使用第一个查询
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多