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 |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ