Группировка данных: GROUP BY и HAVING
Превращаем много строк в одну аккуратную строку на группу
GROUP BY собирает строки с одинаковым значением в группы, а затем выполняет агрегат (например COUNT или SUM) один раз на каждую группу. Потом HAVING оставляет или убирает целые группы, глядя на этот агрегат.
- формировать группы строк с помощью
GROUP BY, - получать одно агрегатное значение на группу (количество, сумму, среднее, минимум, максимум),
- фильтровать целые группы через
HAVING, - отличать
WHERE(фильтрует строки) отHAVING(фильтрует группы), - избегать классической ошибки — выбора столбца, который не сгруппирован и не агрегирован.
1. Что значит "группировать"?
Представьте большую корзину чистого белья. Прежде чем разложить его, вы сортируете вещи в стопки: одна стопка носков, одна рубашек, одна полотенец. Теперь на вопрос "сколько носков?" легко ответить, ведь все носки лежат в одной стопке.
Группировка в SQL делает со строками то же самое. Вы выбираете столбец, и каждая строка с одинаковым значением в этом столбце попадает в одну и ту же стопку. Затем можно задать один вопрос про каждую стопку сразу: сколько? какая сумма? какое среднее?
В прошлом уроке вы узнали агрегатные функции COUNT, SUM, AVG, MIN и MAX. Сами по себе они сжимают всю таблицу до одного числа. GROUP BY позволяет получить это число для каждой стопки, а не для всего сразу.
2. Наша таблица-пример: зоомагазин
Весь урок мы будем пользоваться одной маленькой таблицей — списком питомцев на продажу. Вот как она создаётся и заполняется.
CREATE TABLE pets (
id INT PRIMARY KEY,
name VARCHAR(20),
species VARCHAR(10),
age INT,
price DECIMAL(6,2)
);
INSERT INTO pets (id, name, species, age, price) VALUES
(1, 'Rex', 'dog', 3, 200.00),
(2, 'Bella', 'dog', 5, 150.00),
(3, 'Milo', 'cat', 2, 100.00),
(4, 'Luna', 'cat', 4, 120.00),
(5, 'Coco', 'cat', 1, 90.00),
(6, 'Nemo', 'fish', 1, 20.00),
(7, 'Goldie', 'fish', 2, 15.00);
Вся таблица (SELECT * FROM pets;):
| id | name | species | age | price |
|---|---|---|---|---|
| 1 | Rex | dog | 3 | 200.00 |
| 2 | Bella | dog | 5 | 150.00 |
| 3 | Milo | cat | 2 | 100.00 |
| 4 | Luna | cat | 4 | 120.00 |
| 5 | Coco | cat | 1 | 90.00 |
| 6 | Nemo | fish | 1 | 20.00 |
| 7 | Goldie | fish | 2 | 15.00 |
Обратите внимание: столбец species повторяется — две собаки, три кота, две рыбки. Именно такой повторяющийся столбец идеально подходит для группировки.