Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Как работает GROUP BY в MySQL?

#mysql #sql


Привет.

Вопрос по sql по клаузуле GROUP BY. 


Рассмотрим группировку по ОДНОМУ столбцу. Пример:

SELECT DEPARTMENT_ID, SUM(SALARY) 
FROM Employees
GROUP BY DEPARTMENT_ID;




То есть, в столбце DEPARTMENT_ID ищется уникальное (похоже на DISTINCT) значение
отдела, например, 30, затем ищутся все строки, где упоминается отдел 30 в данной таблице,
из этих строк берутся значения из столбца SALARY и суммируются (SUM). Потом ищется
другой покупатель и все повторяется. В итоге я получаю сколько получил вообще денег
каждый отдел.

Не понимаю момент: у меня есть 6 строк, в которых есть столбец DEPARTMENT_ID со значением
30. Какая из строк пойдет в таблицу-SELECT и почему? То есть, в таблице Employees было
шесть строк с DEPARTMENT_ID 30, а в таблице-SELECT такая строка только одна. Как вообще
эта группировка работает?
Рассмотрим группировку по двум столбцам. Ее я вообще не понимаю. Даже картинки нормальной
не нашел, из которой было бы понятно. Просмотрел кучу статей и книг по этому вопросу,
но не понял ничего.

    


Ответы

Ответ 1



Добавлю с примером запросов и вывода GROUP BY по двух полях. Смотреть можна по таблице в которую например сохраняеться какой пользователь(user_id) вносил деньги, на какой счет(account) и сколько(balance). Например нужно узнать сколько каждый пользователь внес на каждый со своих счетов. SELECT MIN(user_id), MIN(account), SUM(balance) FROM `t1` GROUP BY user_id, account; Работает GROUP BY по двух полях так же как и по одному, сначала сортирует, а потом смотрит если оба значения в строке такие же как и в предыдущей строке тогда групирует эти строки. Если хотя бы одно значение не такое как в предыдущей строке тогда групировки не будет. Для 3 и больше полей GROUP BY работает так же. Результат:

Ответ 2



В выборку после group by не попадет ни одна из изначальных строк. На выходе агрегат - сумма данных в нужном разрезе. К колонкам, к которым вы явно не применили никаких групповых функций (таких как sum()), будет применена функция "первое попавшееся". Причем только в MySQL и только при выключенной опции ONLY_FULL_GROUP_BY. В остальных СУБД запрос, в котором хотя бы к одной колонке, не являющейся разрезом указанным в group by, "забыли" применить групповую функцию выдадут ошибку. Как работает group by можно прикинуть в экселе. Запишите данные на лист, отсортируйте по тем полям, которые должны быть в group by. Читая отсортированные данные подряд в любом случае когда значение в очередной строке в колонках, указанных в group by отличается от значений в предыдущей - вставьте новую строку, скопируйте значения колонок group by, а в остальные поместите формулы вроде СУММ() ячеек группы под которой подводится итог. Результат group by - это именно эти вставленные итоговые записи. СУБД работает примерно по такому же алгоритму - сначала сортирует, потом суммирует идущие подряд одинаковые записи. Добавлю про MySQL - он все таки слишком вольно к этому относится, старайтесь всегда явно применять групповые функции ко всем колонкам, что бы самому понимать что именно в них окажется, ибо 'первое попавшееся' ни чем не стандартизировано и может меняться от версии к версии и в зависимости от физического расположения записей на диске и плана выполнения запроса.

Комментариев нет:

Отправить комментарий