2015-03-27 3 views
0

Если я пишуGROUP BY и HAVING в SQL

SELECT continent FROM world GROUP BY continent HAVING sum(population) >= 100000000 

он будет возвращать все континенты, которые имеют общую сумму более 100 млн. Но если я не буду оставлять GROUP BY так

SELECT continent FROM world HAVING sum(population) >= 100000000 

он вернется только на один континент (в данном случае Азия).

Почему?

+0

Поскольку он выполняет 'sum' для всего набора данных: вы не указали' GROUP BY' явно, поэтому он сгруппирован по всему набору данных. – zerkms

ответ

3

Когда у вас нет GROUP BY, агрегатные функции, такие как SUM(), работают по всей таблице, рассматривая все как одну большую группу. Вот почему вы получаете только один ряд результатов.

Когда вы используете функцию агрегата, технически не верно возвращать любые столбцы в списке SELECT, отличном от списка в предложении GROUP BY, поэтому ваш запрос недействителен SQL. Некоторые базы данных, такие как MySQL, позволяют возвращать другие столбцы в качестве расширения; в этом случае он выбирает значения из произвольных строк в группе. И если нет предложения GROUP BY, вся таблица - одна группа, поэтому вы получаете столбец continent из некоторой случайной строки в таблице.

Смежные вопросы