Что такое оператор GROUP BY в SQL
Что проверяют
Для тестировщика это вопрос не о синтаксисе, а о том, сможете ли вы сами проверить данные в базе: найти дубли, сверить итог отчёта в интерфейсе с таблицей, посчитать заказы по статусам после прогона. Следом почти всегда спрашивают разницу между WHERE и HAVING и просят написать запрос на поиск дубликатов.
Как отвечать
GROUP BY собирает строки с одинаковыми значениями указанных колонок в группы, и агрегатная функция (COUNT, SUM, AVG, MIN, MAX) считается по каждой группе отдельно. На выходе одна строка на группу.
Логический порядок выполнения стоит знать наизусть: FROM и JOIN, затем WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Из него следует остальное:
WHEREпротивHAVING:WHEREотбрасывает строки до группировки и агрегатов не видит,HAVINGфильтрует готовые группы по результату агрегата;- колонки в
SELECT: всё, что не под агрегатом, должно быть вGROUP BY. PostgreSQL выдаст ошибку, MySQL с включённым по умолчаниюONLY_FULL_GROUP_BYтоже, а без этого режима вернёт значение из случайной строки группы; NULL: все строки сNULLв колонке группировки попадают в одну группу.COUNT(*)считает строки, аCOUNT(column)пропускаетNULL, и расхождение между ними часто и есть найденный баг;- порядок: группировка не сортирует результат, для стабильного вывода нужен
ORDER BY.
Типовая проверка, которую стоит показать:
SELECT email, COUNT(*) AS cnt
FROM users
GROUP BY email
HAVING COUNT(*) > 1;Запрос находит пользователей, зарегистрированных дважды на один адрес. Так же сверяют цифры дашборда с базой: SUM(amount) с группировкой по дате и статусу заказа.
Где спотыкаются
Пишут агрегат в WHERE, например WHERE COUNT(*) > 1. Это ошибка, условие по агрегату живёт только в HAVING.
Считают через COUNT(column) и не замечают, что строки с пустым значением выпали из подсчёта. В проверке данных это прямой путь пропустить дефект.
Группируют после JOIN с таблицей «один ко многим» и получают завышенные суммы: строка заказа размножилась по числу позиций. Для тестировщика это вдвойне опасно, потому что ошибочный запрос «подтвердит» неверную цифру в отчёте.