Разница между GROUP BY и DISTINCT, без агрегатных функций - PullRequest
0 голосов
/ 01 июля 2018

В чем разница между 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 голосов
/ 01 июля 2018

В MySql нельзя действительно доверять результатам агрегатной функции, такой как SUM, когда вы используете DISTINCT.
Потому что с 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 и SUM:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...