惊喜——这是MySQL中一个非常有效的查询:

select X, Y from someTable group by X

如果在Oracle或SQL Server中try 此查询,则会收到自然错误消息:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.

那么MySQL如何确定每个X显示哪个Y呢?它只是选了一个.据我所知,它只是 Select 了它找到的第一个Y.理由是,如果Y既不是聚合函数,也不在group by子句中,那么在查询中指定"select Y"就没有意义了.因此,我作为数据库引擎将返回我想要的任何内容,您会喜欢的.

甚至还有一个MySQL配置参数来关闭这种"松散".

本文甚至提到MySQL在这方面被批评为不符合ANSI-SQL标准.

我的问题是:Why是这样设计的吗?他们放弃ANSI-SQL的理由是什么?

推荐答案

我认为这是为了处理这样一种情况,即按一个字段分组意味着其他字段也在分组:

SELECT user.id, user.name, COUNT(post.*) AS posts 
FROM user 
  LEFT OUTER JOIN post ON post.owner_id=user.id 
GROUP BY user.id

在本例中,是用户.每个用户的名称都是唯一的.id,因此不需要用户就很方便了.GROUP BY条款中的名称(尽管,正如你所说,存在明确的问题范围)

Mysql相关问答推荐

MySQL INSERT INSERT ON DIPLICATE KEY UPDATE WITH COMPAY PRIMARY KEY失败

如何在MySQL中检索两列的值不同的行

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

表列中的SQL SUM MENY值记录单个查询

我是否需要在 N+1 列上建立索引,才能有效地在 N 列上执行 SELECT,并按其他列排序?

Mysql根据文本语言或行数将列拆分为多列

基于其列之一内的值查询模型

如何使用减号运算符编写 sql 查询以返回缺少相应值的行?

如何在不使用子查询的情况下按最小日期计算新用户?

MySQL表中给定字段的每个不同值的连续记录形成对

MySQL查询以获取日期范围内的租赁订单

如何在每个国家/地区查询 GHTorrent(类 SQL 语言)的最常用语言

SQL 查找边界之间的值

org.hibernate.InstantiationException:没有实体的默认构造函数::principal.Cliente

SQL - 如何找到列中的最高数字?

安装 mysql-python (Windows)

在 MySQL 中检测 utf8 损坏的字符

ON UPDATE RESTRICT 有什么作用?

MySQL更新查询与左连接和分组依据

如何通过一个语句描述数据库中的所有表?