JavaRush /Курси /All lectures for UA purposes /Групування даних

Групування даних

All lectures for UA purposes
Рівень 1 , Лекція 522
Відкрита

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
Коментарі (2)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Тимур Рівень 46
12 липня 2025
2. Складні запити з GROUP BY SELECT brand, COUNT(*) FROM product WHERE price < 10 GROUP BY brand У рядку «WHERE price < 10» фільтруються для відображення результати, де ціна менше 10, а в описі, к прикладу, говориться навпаки - "спочатку відкинемо продукти, ціна яких менша за 10". Чи я щось не так зрозумів?
Михайло Рівень 117
6 серпня 2025
Для відповіді на своє питання перечитай його)