Разница между GROUP BY и DISTINCT без агрегатных функций

В чем разница между 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? В любом случае вы хотите использовать вторую версию, которая действительно соответствует вашим требованиям. MySQL перегрузил оператор HAVING, чтобы делать довольно странные вещи, одна из которых заключается в том, что он может действовать как предложение WHERE при использовании без GROUP BY. Но используйте вторую версию.

Tim Biegeleisen 01.07.2018 17:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
151
1

Ответы 1

В 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 и будет отвергнут любой уважающей себя СУБД.
a_horse_with_no_name 01.07.2018 19:21

Ты прав. Я забыл, что в вопросе отсутствовал тег mysql. Поскольку на этом веб-сайте sqlzoo по умолчанию используется mysql, а это ваша типичная проблема MySql, я просто предположил, что это касается MySql. Во всяком случае, поправил.

LukStorms 01.07.2018 20:20

Другие вопросы по теме