GROUP BY和DISTINCT之间的区别,没有聚合函数

时间:2018-07-01 15:08:13

标签: mysql sql

DISTINCT和GROUP BY有什么区别。我知道DISTINCT会删除复制的值,并且GROUP BY通常与聚合函数一起使用,但是为什么在下面的代码下

    SELECT DISTINCT continent FROM world
    HAVING SUM(population) > 100000000;

仅显示1个大洲,并且此:

    SELECT continent FROM world
    GROUP BY continent HAVING SUM(population) > 100000000;

显示每个大洲吗? 我在做问题https://sqlzoo.net/wiki/SUM_and_COUNT。 我正在尝试显示SUM(人口)大于100000000的每个大陆。谢谢大家。

1 个答案:

答案 0 :(得分:1)

在MySql中,当您使用DISTINCT时,不能真正相信像SUM这样的聚合函数的结果。
因为使用DISTINCT,它实际上不在其他列上分组。

请注意,在MySql和亲戚以外的其他数据库中,不会遇到这种混乱。因为那些人​​会抱怨GROUP BY中缺少字段。

以更直观的方式进行解释。

使用此示例数据(MySql):

drop table if exists tmp_table;
create temporary table tmp_table (col1 int, col2 char(1), col3 int);

insert into tmp_table (col1, col2, col3) values
(1,'A',1),(2,'A',2),(3,'A',3),
(4,'B',4),(5,'B',5),(6,'B',6);

通过DISTINCT和求和:

select distinct col2, sum(col3) from tmp_table;

返回:

col2 sum(col3)
---- ---------
A           21

通过GROUP BY:

select col2, sum(col3) from tmp_table group by col2;

返回:

col2 sum(col3)
---- ---------
A            6
B           15

然后,当我们在这些查询中包含HAVING子句

... having sum(col3) > 10;

然后第一次选择将返回错误的结果:('A',21)
第二个选择将返回您期望的结果:('B',15)

相关问题