首页 > 数据库 > mysql教程 > 为什么'GROUP BY”子句在 MySQL 和 PostgreSQL 中的工作方式不同?

为什么'GROUP BY”子句在 MySQL 和 PostgreSQL 中的工作方式不同?

Mary-Kate Olsen
发布: 2025-01-18 09:41:10
原创
519 人浏览过

Why Does a `GROUP BY` Clause Work Differently in MySQL and PostgreSQL?

MySQL 和 PostgreSQL GROUP BY 子句:比较

流行的关系数据库系统 MySQL 和 PostgreSQL 对 GROUP BY 子句的处理方式不同。 该子句根据指定的列对行进行分组,从而启用对分组数据进行聚合函数计算。 让我们来看看主要的区别。

常见场景涉及包含列 the_tablecol1col2 的表(例如 col3)。 在 MySQL 中,像 SELECT col2, col3, col1 FROM the_table GROUP BY col2; 这样的查询可能会返回结果,看似为每个 col3 组中的 col1col2 选择任意值。 然而,在 PostgreSQL 中相同的查询会产生错误。

为什么 PostgreSQL 会出错?

PostgreSQL 严格遵守 SQL 标准。 该标准要求 SELECT 列表中未包含在 GROUP BY 子句 中的任何列都必须 是聚合函数的一部分。 在我们的示例中,col3col1 违反了此规则。

聚合函数解释

聚合函数(如 MINMAXAVGSUMCOUNT)从多行计算单个值。 它们对于汇总分组数据至关重要。

MySQL 的非标准行为

MySQL 的行为背离了标准。 它允许选择不在 GROUP BY 子句中的非聚合列,但这是不可靠的。这些列的选定值是不可预测的,并且取决于数据库的内部工作原理;不保证它们是一致的。

符合标准的查询

为了确保两个数据库的结果一致且可预测,请始终对 GROUP BY 子句中不存在的列使用聚合函数。 以下查询在 MySQL 和 PostgreSQL 中都可以正确运行:

<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table
GROUP BY col2;</code>
登录后复制

此查询使用 MIN() 查找每个 col3 组的 col1col2 的最小值,提供明确定义的结果。 将 MIN() 替换为其他聚合函数,例如 MAX()AVG() 等,可为每个组提供不同的汇总统计数据。 这种方法保证了标准 SQL 合规性,并避免了 MySQL 的非标准 GROUP BY 扩展中固有的歧义。

以上是为什么'GROUP BY”子句在 MySQL 和 PostgreSQL 中的工作方式不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板