【问题标题】:Mysql 'group by' clause does not give errorMysql 'group by' 子句不报错
【发布时间】:2017-02-10 10:19:56
【问题描述】:

我的表格名称是“product”,其中包含以下列。

1. id
2. name
3. description
4. Price

在运行以下 SQL 查询时,这不会给我一个错误。

select name, sum(Price) from product group by Description;

在 PostgreSQL 上运行此查询时出现错误。

根据“group by”子句,select 子句中的列名应该是 group by 条件的一部分。

因此根据上述,SQL 查询名称应该是按条件分组的一部分。

【问题讨论】:

  • 亲爱的mysql是用户友好的..它不认为它是错误而postgresql和sql server都必须遵循使用聚合函数的分组函数规则

标签: mysql database postgresql


【解决方案1】:

在 MySQL 中,此行为可通过 ONLY_FULL_GROUP_BY sql 模式设置进行配置:

拒绝选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列的查询,这些列既不在 GROUP BY 子句中命名,也不在功能上依赖于(唯一地由)GROUP BY 列。

从 MySQL 5.7.5 开始,默认 SQL 模式包括 ONLY_FULL_GROUP_BY。 (在 5.7.5 之前,MySQL 不检测函数依赖和 ONLY_FULL_GROUP_BY 默认不启用。对于描述 5.7.5 之前的行为,请参阅 MySQL 5.6 参考手册。)

在你的 MySQL ONLY_FULL_GROUP_BY sql 模式显然没有设置。如果您希望 MySQL 拒绝查询,那么您需要启用此行为。实际上,我鼓励大家确保启用此 sql 模式 - 除非您真的知道自己在做什么。

【讨论】:

【解决方案2】:

你应该这样写查询

您应该在选择列名中只写按列名和聚合函数分组

select Description, sum(Price) from product group by Description;

如果你想得到名字,你应该像这样写查询

您应该在 group by 中添加名称。

select name, sum(Price) from product group by name,Description;

如果你只想按描述分组,那么你可以这样写查询。

select max(name), sum(Price) from product group by Description;

如果名称相同,您可以使用minmax 函数获取名称或简单地添加到分组中

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多