3.1 Оператор GROUP BY

Язык SQL очень мощный. Кроме простой выборки данных он позволяет выполнять группировку данных во время запроса. Например, мы хотим узнать сколько видов продуктов каждого бренда у нас есть, как нам это сделать?

Для этого есть специальный оператор GROUP BY, вот как он пишется.

GROUP BY колонка

Давай напишем запрос, с помощью которого попросим SQL отобразить количество видов товаров каждого бренда. Выглядеть такой запрос будет примерно так:

SELECT brand, COUNT(*)
FROM product
GROUP BY brand

Ты получишь такой результат запроса:

brand count(*)
(NULL) 2
Bosch 4
IKEA 6
LG 2
SmartFlower 1

Давай внимательно разберем, что за запрос мы написали, и что за результат получили. В результате мы видим две колонки. Первая со списком брендов, что логично. Мы и хотели получить что-то типа набора пар "бренд --> количество".

Обрати внимание, что среди имен брендов присутствует слово NULL. Действительно у нас есть продукты в бренде, в который записано NULL, и мы их тут видим. Немного неожиданно, но полезно. Мы можем видеть, сколько есть продуктов без бренда.

Теперь посмотрим внимательно на запрос. Мы хотели узнать количество продуктов каждого бренда, поэтому написали GROUP BY brand, а в SELECT написали brand и выражение COUNT(*)

COUNT(*) – это так называемая агрегатная функция, которая выполняется над группой строк. В нашем случае она просто считает их количество. Таких функций очень много, и мы рассмотрим их немного позднее.

3.2 Сложные запросы с GROUP BY

Теперь давай напишем запрос, где сначала отбросим продукты, цена которых меньше 10, а потом сгруппируем их. Выглядеть такой запрос будет примерно так:

SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand

Ты получишь такой результат запроса:

brand count(*)
Bosch 4
IKEA 5
LG 2
SmartFlower 1

Из нашей таблицы результатов пропали все NULL-продукты, так как они были очень дешевые, а также количество IKEA продуктов уменьшилось на 1. Было 6, а стало 5.

Это говорит о том, что ты сначала применяешь WHERE для фильтрации нужных строк, а уже потом к полученному результату применяете группировку.

3.3 Имена колонок у результата

Кстати, ты можешь задавать имена результирующим колонкам. Видишь, что в качестве имени последней колонки сервер предложил имя count(*)? Давай заменим его на total. Выглядеть такой запрос будет примерно так:

SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand

Ты получишь такой результат запроса:

brand total
Bosch 4
IKEA 5
LG 2
SmartFlower 1

Также ты можешь переименовать и существующие колонки. Давай возьмем один из уже использованных запросов и добавим колонкам новые имена.

SELECT
id AS  product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL

Получишь такой результат запроса:

product_id product_name price
2 Стул 5.00
8 Лампа 15.00