为什么MySQL的工作方式与SQLServer不同,允许使用GROUP BY子句的多个列

时间:2017-09-27 21:18:18

标签: mysql sql sql-server group-by

在这个方案http://sqlfiddle.com/#!9/71f86a/1中,基于MySQL,我做了一个查询,获取按寄存器号分组的所有记录。在我看来,它会无效,因为我带了一个按寄存器编号分组的非聚合列。

以下代码:

create table client 
  (id int not null auto_increment, 
   city varchar(50), 
   register int,
   primary key(id));

insert into client (city, register) values ('SP', 111);
insert into client (city, register) values ('MG', 111);
insert into client (city, register) values ('ES', 111);
insert into client (city, register) values ('SP', 111);
insert into client (city, register) values ('SP', 222);
insert into client (city, register) values ('MG', 222);
insert into client (city, register) values ('SP', 333);

查询select * from client group by register返回:

id  city    register
1   SP      111
5   SP      222
7   SP      333

在另一个方案http://sqlfiddle.com/#!6/5b1ba1/1中,构建SQLServer,错误' Column' client.id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。'根据我的说法归还。

以下代码:

create table client 
  (id int identity(1,1) primary key, 
   city varchar(50), 
   register int);

insert into client (city, register) values ('SP', 111);
insert into client (city, register) values ('MG', 111);
insert into client (city, register) values ('ES', 111);
insert into client (city, register) values ('SP', 111);
insert into client (city, register) values ('SP', 222);
insert into client (city, register) values ('MG', 222);
insert into client (city, register) values ('SP', 333);

相同的先前查询select * from client group by register返回:

  

专栏' client.id'在选择列表中无效,因为它不是   包含在聚合函数或GROUP BY子句中。

为什么MySQL更宽松?这不会带来不必要的结果吗?

1 个答案:

答案 0 :(得分:0)

  

为什么MySQL更宽松?这不会带来不必要的结果吗?

无可否认地,对于不属于GROUP BY子句的非聚合列,将返回不确定结果。包括我自己在内的更多厌倦的数据库开发人员一直认为这个按设计破坏(BAD)而不是许可

MySQL的默认行为在几年前在5.7.5版本中发生了变化。您在sqlfiddle.com上的查询使用5.6版。版本5.7.5使MySQL更接近于GROUP BY的标准SQL。