MySQL 和 PostgreSQL GROUP BY
子句:比较
流行的关系数据库系统 MySQL 和 PostgreSQL 对 GROUP BY
子句的处理方式不同。 该子句根据指定的列对行进行分组,从而启用对分组数据进行聚合函数计算。 让我们来看看主要的区别。
常见场景涉及包含列 the_table
、col1
和 col2
的表(例如 col3
)。 在 MySQL 中,像 SELECT col2, col3, col1 FROM the_table GROUP BY col2;
这样的查询可能会返回结果,看似为每个 col3
组中的 col1
和 col2
选择任意值。 然而,在 PostgreSQL 中相同的查询会产生错误。
为什么 PostgreSQL 会出错?
PostgreSQL 严格遵守 SQL 标准。 该标准要求 SELECT
列表中未包含在 GROUP BY
子句 中的任何列都必须 是聚合函数的一部分。 在我们的示例中,col3
和 col1
违反了此规则。
聚合函数解释
聚合函数(如 MIN
、MAX
、AVG
、SUM
、COUNT
)从多行计算单个值。 它们对于汇总分组数据至关重要。
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
组的 col1
和 col2
的最小值,提供明确定义的结果。 将 MIN()
替换为其他聚合函数,例如 MAX()
、AVG()
等,可为每个组提供不同的汇总统计数据。 这种方法保证了标准 SQL 合规性,并避免了 MySQL 的非标准 GROUP BY
扩展中固有的歧义。
以上是为什么'GROUP BY”子句在 MySQL 和 PostgreSQL 中的工作方式不同?的详细内容。更多信息请关注PHP中文网其他相关文章!