В чем разница между 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. Спасибо, ребята.






В 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)
select distinct col2, sum(col3) from tmp_table; вернет только ошибку. Это недопустимый стандартный SQL и будет отвергнут любой уважающей себя СУБД.
Ты прав. Я забыл, что в вопросе отсутствовал тег mysql. Поскольку на этом веб-сайте sqlzoo по умолчанию используется mysql, а это ваша типичная проблема MySql, я просто предположил, что это касается MySql. Во всяком случае, поправил.
Вы используете MySQL? В любом случае вы хотите использовать вторую версию, которая действительно соответствует вашим требованиям. MySQL перегрузил оператор
HAVING, чтобы делать довольно странные вещи, одна из которых заключается в том, что он может действовать как предложениеWHEREпри использовании безGROUP BY. Но используйте вторую версию.