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