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