【问题标题】:Having Without Group By in MySQL在 MySQL 中没有 Group By
【发布时间】:2021-01-09 10:47:31
【问题描述】:

我已经阅读了多篇文章,现在我对以下两种说法感到困惑。

  1. 如果我们使用没有分组的情况,那么整个表将充当单个组。
  2. 如果我们使用没有分组,那么每个表都充当一个单独的组。

在 MySQL 中哪一个是正确的? 例如,我有一个名为 ABC 的表如下:

|   Wage    | 
_____________
|    4      | 
|    8      | 
|    28     | 
|    90     |

如果我们使用以下查询

select wage 
from ABC
having wage > 1

然后打印所有记录。所以每一行都是独立的组。

但如果我们使用:

select wage
from ABC
having wage = max(wage)

没有记录被打印出来。所以整个表作为一个组工作。

那么哪一个是正确的,为什么这两个查询显示不同的结果。

【问题讨论】:

  • MySQL 中哪一个是正确的? 两者都是。或者没有。在每种特定情况下,这些陈述中的哪些陈述与 HAVING 子句的存在无关。如果使用任何 aggergate 函数,则 (1) 为真,否则 (2) 为真。

标签: mysql group-by max greatest-n-per-group having-clause


【解决方案1】:

不要在没有group by 的情况下使用having。尽管 MySQL 支持这一点,但这不是有效的标准 SQL,而且您得到的行为很可能是违反直觉的。

第一个查询应该只是一个where 子句:

select wage from abc where wage > 1

第一个查询毫无意义:having 子句中既有聚合的 wage 又有非聚合的 wage。如果你想要工资最高的那一行,那么你可以order by和limit:

select wage
from abc
order by wage desc limit 1

或者,如果您想允许平局,请使用相关子查询:

select *
from abc a
where wage = (select max(a1.wage) from abc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多