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的每个大陆。谢谢大家。
答案 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)