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
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0221
Напиши запрос, который из таблицы cars выберет года выпуска (prod_year) с указанием количества машин выпущенных в определенный год.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0222
Напиши запрос, который из таблицы cars выберет информацию о том, сколько каких названий (name) автомобилей есть в наличии.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0223
Напиши запрос, который из таблицы employee выберет информацию о том, сколько в каждом департаменте (department) сотрудников.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0224
Напиши запрос, который из таблицы employee выберет информацию о том, сколько в каждом департаменте (department) сотрудников со специальностью (position) 'backend developer'.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0225
Напиши запрос, который из таблицы cars выберет информацию о том, сколько синих автомобилей (name равен 'Blue Car') выпущено в каждом году (prod_year), в котором они выпускались.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0226
Напиши запрос, который из таблицы cars выберет информацию о том, сколько каких автомобилей (name) было выпущено в 2021 году (prod_year).
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0227
Напиши запрос, который из таблицы cars выберет года выпуска (prod_year) с указанием количества машин выпущенных в определенный год. Колонка с количеством в результате должна иметь название car_count.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0228
Напиши запрос, который из таблицы employee выберет информацию о том, сколько в каждом департаменте (department) сотрудников. Колонка с количеством в результате должна иметь название number_of_employees.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0229
Напиши запрос, который из таблицы cars выберет информацию о том, сколько каких названий (name) автомобилей есть в наличии. Колонка с именем в результате должна иметь название car_name, а колонка с количеством - car_count.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0230
Напиши запрос, который из таблицы employee выберет информацию о том, сколько в каждом департаменте (department) сотрудников со специальностью (position) 'frontend developer'. Колонка с департаментом в результате должна иметь название department_name, а колонка с количеством - count.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 2 лекция
Недоступна
task0231
Напиши запрос, который из таблицы employee выберет информацию о том, сколько в каждом департаменте (department) сотрудников со специальностью (position) 'frontend developer' или (OR) 'backend developer'. Колонка с департаментом в результате должна иметь название department_name, а ко