GROUP BY и HAVING
Чтобы получить более глубокие аналитические сведения и лучше упорядочить данные в базе данных, SQL представляет мощные GROUP BY и HAVING предложения.
Эти средства позволяют преобразовать необработанные данные в значимые сводки, классифицируя строки и применяя агрегатные функции, что упрощает анализ тенденций, определение шаблонов или создание отчетов, адаптированных к определенным категориям.
ГРУППИРОВКА ПО
Для анализа данных по категориям или группам SQL предоставляет оператор GROUP BY. Это предложение классифицирует строки на основе значений в указанных столбцах, эффективно секционируя данные на подмножества.
Реальная сила GROUP BY показывается при использовании с агрегатными функциями. Агрегатные функции, такие как COUNT(), SUM(), AVG(), MIN() и MAX(), выполняют вычисления для этих групп, позволяя создавать сводную статистику для каждой категории.
Например, вы можете использовать GROUP BY для вычисления: -total продаж SUM() для каждой категории продуктов, -average цену AVG() продуктов от каждого поставщика, -number клиентов COUNT() в каждом городе.
SELECT category_id, AVG(price)
FROM sales.products
GROUP BY category_id;
Этот запрос извлекает среднюю цену продуктов в каждой категории, группируя строки таблицы sales.products в соответствии с их category_id. При применении функции AVG() к столбцу price, запрос вычисляет среднее значение цен для всех продуктов под каждым уникальным category_id.
GROUP BY предложение не всегда должно быть сопряжено с агрегатными функциями. Хотя это обычно используется вместе с агрегатными функциями для выполнения вычислений сгруппированных данных, GROUP BY также можно использовать для организации данных в группы для других целей, таких как получение различных сочетаний столбцов.
SELECT category_id
FROM sales.products
GROUP BY category_id;
Этот запрос группирует строки по category_id, не выполняя агрегирование, просто перечисляя каждое отдельное category_id, представленное в таблице sales.products.
ОБЛАДАНИЕ
В SQL WHERE предложение нельзя использовать для фильтрации результатов агрегатных функций.
Чтобы отфильтровать группы, созданные предложением GROUP BY на основе результатов агрегации функции, используйте предложение HAVING.
Подумайте о HAVING как об условии WHERE для групп: это позволяет применять условия к сведённым данным, созданным агрегатными функциями, позволяя детализировать анализ и сосредоточиться на соответствующих группах.
SELECT category_id, AVG(price)
FROM sales.products
GROUP BY category_id
HAVING AVG(price) > 30;
Этот запрос вычисляет среднее значение price продуктов в каждой категории путем группировки строк sales.products таблицы в соответствии с их category_id. Затем он фильтрует результаты, чтобы включить только те категории, где среднее price значение превышает 30 с помощью HAVING предложения.