- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我习惯了包括 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 页:
- 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 theSELECT
andHAVING
lists are functionally dependent on theGROUP BY
columns. If not, you may get indeterminate results.
If you want to disable it, you can set
sql_mode
toONLY_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/
是否有某种方法可以使用 JPA 或 Hibernate Crtiteria API 来表示这种 SQL?或者我应该将其作为 native 执行吗? SELECT A.X FROM (SELECT X,
在查询中, select id,name,feature,marks from (....) 我想删除其 id 在另一个 select 语句中存在的那些。 从 (...) 中选择 id 我是 sql
我想响应用户在 select 元素中选择一个项目。然而这个 jQuery: $('#platypusDropDown').select(function () { alert('You sel
这个问题在这里已经有了答案: SQL select only rows with max value on a column [duplicate] (27 个回答) 关闭8年前。 我正在学习 SQL
This question already has answers here: “Notice: Undefined variable”, “Notice: Undefined index”, and
我在 php 脚本中调用 SQL。有时“DE”中没有值,如果是这种情况我想从“EN”中获取值 应该是这样的,但不是这样的 IF (EXISTS (SELECT epf_application_deta
这可能是一个奇怪的问题,但不知道如何研究它。执行以下查询时: SELECT Foo.col1, Foo.col2, Foo.col3 FROM Foo INNER JOIN Bar ON
如何在使用 Camera.DestinationType.FILE_URI. 时在 phonegap camera API 中同时选择或拾取多个图像我能够一次只选择一张图像。我可以使用 this 在
这是一个纯粹的学术问题。这两个陈述实际上是否相同? IF EXISTS (SELECT TOP 1 1 FROM Table1) SELECT 1 ELSE SELECT 0 相对 IF EXIS
我使用 JSoup 来解析 HTML 响应。我有多个 Div 标签。我必须根据 ID 选择 Div 标签。 我的伪代码是这样的 Document divTag = Jsoup.connect(link
我正在处理一个具有多个选择框的表单。当用户从 selectbox1 中选择一个选项时,我需要 selectbox2 active 的另一个值。同样,当他选择 selectbox2 的另一个值时,我需要
Acme Inc. Christa Woods Charlotte Freeman Jeffrey Walton Ella Hubbard Se
我有一个login.html其中form定义如下: First Initial Plus Last Name : 我的do_authorize如下: "; pri
$.get( 'http://www.ufilme.ro/api/load/maron_online/470', function(data
我有一个下拉列表“磅”、“克”、“千克”和“盎司”。我想要这样一种情况,当我选择 gram 来执行一个函数时,当我在输入字段中输入一个值时,当我选择 pounds 时,我想要另一个函数来执行时我在输入
我有一个 GLSL 着色器,它从输入纹理的 channel 之一(例如 R)读取,然后写入输出纹理中的同一 channel 。该 channel 必须由用户选择。 我现在能想到的就是使用一个 int
我想根据下拉列表中的选定值生成输入文本框。 Options 2 3 4 5 就在这个选择框之后,一些输入字段应该按照选定的数字出现。 最佳答案 我建议您使用响应式(Reac
我是 SQL 新手,我想问一下如何根据首选项和分组选择条目。 +----------+----------+------+ | ENTRY_ID | ROUTE_ID | TYPE | +------
我有以下表结构: CREATE TABLE [dbo].[UTS_USERCLIENT_MAPPING_USER_LIST] ( [MAPPING_ID] [int] IDENTITY(1,1
我在移除不必要的床单时遇到了问题。我查看了不同的论坛并将不同的解决方案混合在一起。 此宏删除工作表(第一张工作表除外)。 Sub wrong() Dim sht As Object Applicati
我是一名优秀的程序员,十分优秀!