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(*) — це так звана агрегатна функція, яка виконується над групою рядків. У нашому випадку вона просто рахує їхню кількість. Таких функцій дуже багато, і ми розглянемо їх трохи згодом.

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. Імена колонок у результату

До речі, ти можеш вказувати імена для результуючих колонок. Бачиш, як ім'я останньої колонки сервер запропонував 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