Этот вопрос проверяет знание ключевых операций SQL для агрегации данных, их фильтрации и объединения связанной информации из нескольких таблиц.
GROUP BY (группировка) используется для объединения строк с одинаковыми значениями в сводные строки, часто вместе с агрегирующими функциями (COUNT, SUM). Фильтрация (WHERE и HAVING) позволяет выбирать только нужные строки: WHERE фильтрует строки до группировки, а HAVING — после. JOIN (соединение) позволяет объединять данные из двух или более таблиц на основе связи между ними.
Это три фундаментальных кита для построения полезных SQL-запросов.
Назначение: Агрегировать данные, то есть объединять несколько строк в одну по заданному критерию, вычисляя для каждой группы какое-то общее значение.
Как работает: Оператор GROUP BY группирует строки, имеющие одинаковые значения в указанных столбцах. После этого можно применить агрегирующие функции.
Агрегирующие функции: COUNT(), SUM(), AVG(), MAX(), MIN().
Пример: Посчитать количество заказов у каждого клиента.
SELECT customer_id, COUNT(*) as order_count
FROM orders
GROUP BY customer_id;WHERE
Применяется: К отдельным строкам до того, как они будут сгруппированы.
Не может использоваться с агрегирующими функциями.
Пример: Найти клиентов из Москвы и посчитать их заказы.
SELECT customer_id, COUNT(*) as order_count
FROM orders
WHERE city = 'Москва' -- Фильтрация ДО группировки
GROUP BY customer_id;HAVING
Применяется: К группам строк после того, как группировка была выполнена.
Может использоваться с агрегирующими функциями.
Пример: Найти клиентов, у которых больше 5 заказов.
sql
SELECT customer_id, COUNT(*) as order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5; -- Фильтрация ПОСЛЕ группировкиНазначение: Объединять данные из нескольких таблиц на основе связи между столбцами.
Основные типы:
INNER JOIN: Возвращает только те строки, для которых есть совпадение в обеих таблицах.
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, в правой части будет NULL.
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- Покажет всех пользователей, даже тех, у кого нет заказовRIGHT JOIN и FULL JOIN: Аналогичны LEFT, но возвращают все строки из правой или из обеих таблиц соответственно (используются реже).
Вывод:
Используйте GROUP BY для получения сводных данных и агрегатов.
Используйте WHERE для фильтрации исходных данных, а HAVING — для фильтрации результатов агрегации.
Используйте JOIN для объединения связанных данных из разных таблиц, выбирая тип соединения (INNER, LEFT) в зависимости от того, хотите ли вы видеть только совпадения или все записи из одной таблицы.