gpt4 book ai didi

mysql - MySQL 是否通过允许选择不属于 group by 子句的列来打破标准?

转载 作者:IT王子 更新时间:2023-10-29 00:37:10 26 4
gpt4 key购买 nike

我习惯了包括 SQL Server 在内的 Microsoft 技术。今天我遇到了a Q&A其中引用了 MySQL 文档中的以下段落:

Standard SQL would reject your query because you can not SELECTnon-aggregate fields that are not part of the GROUP BY clause in anaggregate query. MySQL extends the use of GROUP BY so that the selectlist can refer to nonaggregated columns not named in the GROUP BYclause. This means that the preceding query is legal in MySQL. Youcan use this feature to get better performance by avoiding unnecessarycolumn sorting and grouping. However, this is useful primarily whenall values in each nonaggregated column not named in the GROUP BY arethe same for each group. The server is free to choose any value fromeach group, so unless they are the same, the values chosen areindeterminate.

MySQL 允许这样做是否违反了标准?如何?允许这样做的结果是什么?

最佳答案

Standard SQL would reject your query because you can not SELECT non-aggregate fields that are not part of the GROUP BY clause in an aggregate query

这是正确的,直到 1992 年

但从 2003 年及以后,它显然是错误的。

根据 SQL-2003 标准, 6IWD6-02-Foundation-2011-01.pdf, from http://www.wiscorp.com/ ,第 7.12 段(查询规范),第 398 页:

  1. If T is a grouped table, then let G be the set of grouping columns of T. In each ((value expression)) containedin ((select list)) , each column reference that references a column of T shall reference some column C thatis functionally dependent on G or shall be contained in an aggregated argument of a ((set function specification))whose aggregation query is QS

现在 MYSQL,通过允许 不仅功能依赖 对分组列 而且 允许 all 来实现此功能列。这会给不了解分组如何工作的用户带来一些问题,并在他们不期望的地方得到不确定的结果。

但是你说 MySQL 添加了一个与 SQL 标准冲突的特性是对的(尽管你似乎认为这是错误的原因)。这并不完全准确,因为他们添加了 SQL 标准功能,但不是以最佳方式(更像是简单方式),但确实与最新标准相冲突。

为了回答您的问题,我认为这个 MySQL 功能(扩展)的原因是符合最新的 SQL 标准(2003+)。为什么他们选择以这种方式实现(不完全合规),我们只能推测。

正如@Quassnoi 和@Johan 用示例回答的那样,这主要是性能和可维护性问题。但是很难将 RDBMS 更改为足够聪明(天网除外)以识别功能相关的列,因此 MySQL 开发人员做出了选择:

We (MySQL) give you (MySQL users) this feature which is in SQL-2003 standards. It improves speed in certain GROUP BY queries but there's a catch. You have to be careful (and not the SQL engine) so columns in the SELECT and HAVING lists are functionally dependent on the GROUP BY columns. If not, you may get indeterminate results.

If you want to disable it, you can set sql_mode to ONLY_FULL_GROUP_BY.

一切尽在MySQL docs: Extensions to GROUP BY (5.5) - 虽然不是在上面的措辞中,而是在你的引用中(他们甚至忘记提到它偏离标准 SQL-2003 而不是标准 SQL-92)。我认为这种选择在所有软件中都很常见,包括其他 RDBMS。它们是出于性能、向后兼容性和许多其他原因而制作的。 Oracle 有著名的 '' is the same as NULL 例如,SQL-Server 可能也有一些。

还有 Peter Bouman 的这篇博文,为 MySQL 开发人员的选择辩护:Debunking GROUP BY myths .

2011 年,作为 @Mark Byers在评论中通知我们(在 DBA.SE 的相关问题中), PostgreSQL 9.1 added a new feature (发布日期:2011 年 9 月)为此目的而设计。它比 MySQL 的实现更严格,更接近标准。

后来,2015 年 MySQL 宣布在 5.7 版本中改进了行为以符合标准并实际识别功能依赖(甚至比 Postgres 实现更好)。文档:MySQL Handling of GROUP BY (5.7)以及 Peter Bouman 的另一篇博文:MySQL 5.7.5: GROUP BY respects functional dependencies!

关于mysql - MySQL 是否通过允许选择不属于 group by 子句的列来打破标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7594865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com