Перейти к содержанию

Группировка данных: GROUP BY и HAVING

Программирование SQL Сложность 1/5

Начало урока

Группировка данных: 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;):

idnamespeciesageprice
1Rexdog3200.00
2Belladog5150.00
3Milocat2100.00
4Lunacat4120.00
5Cococat190.00
6Nemofish120.00
7Goldiefish215.00

Обратите внимание: столбец species повторяется — две собаки, три кота, две рыбки. Именно такой повторяющийся столбец идеально подходит для группировки.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя