MySQL групування


Оператори GROUP BY і HAVING дозволяють згрупувати дані.  Вони вживаються в рамках команди SELECT :

SELECT стовпці
FROM таблиця
[WHERE умова_фільтрації_строк]
[GROUP BY стовпці_для_групування]
[HAVING умова_фільтрації_груп]
[ORDER BY стовпці_для_сортування]

GROUP BY

Оператор GROUP BY визначає, як рядки будуть групуватися.

Наприклад, згрупуємо товари по виробнику

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer

Перший стовпець в виразі SELECT - Manufacturer представляє назву групи, а другий стовпець - ModelsCount представляє результат функції Count , яка обчислює кількість рядків в групі.

І якщо в виразі SELECT проводиться вибірка по одному або кількох стовпцях і також використовуються агрегатні функції, то необхідно вжити вислів GROUP BY . Так, наступний приклад працювати не буде, так як він не містить вираз групування:

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products

Оператор GROUP BY може виконувати груповання по безлічі стовпців. Так, додамо груповання за кількістю товарів:

SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer, ProductCount

Слід враховувати, що вираз GROUP BY повинен йти після висловлення WHERE , але до виразу ORDER BY :

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price > 30000
GROUP BY Manufacturer
ORDER BY ModelsCount DESC

Фільтрація груп. HAVING

Оператор HAVING дозволяє виконати фільтрацію груп, тобто визначає, які групи будуть включені в вихідний результат.

Використання HAVING багато в чому подібне до використання WHERE . Тільки WHERE застосовується для фільтрації рядків, а HAVING - для фільтрації груп.

Наприклад, знайдемо всі групи товарів по виробникам, для яких визначено більше 1 моделі:

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
HAVING COUNT(*) > 1

В одній команді також можна поєднувати вирази WHERE і HAVING :

SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING COUNT(*) > 1;

Тобто в даному випадку спочатку фільтруються рядки: вибираються ті товари, загальна вартість яких більше 80000. Потім вибрані товари групуються по виробникам. І далі фільтруються самі групи - вибираються ті групи, які містять більше 1 моделі.

Якщо при цьому необхідно провести сортування, то вираз ORDER BY йде після висловлення HAVING :

SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING SUM(ProductCount) > 2
ORDER BY Units DESC;

Тут груповання йде по виробникам, і також вибирається кількість моделей для кожного виробника (Models ) і загальна кількість всіх товарів за усіма цими моделями (Units ). В кінці групи упорядковано відповідно до кількості товарів по спадаючій.


Наш партнер:
beta test mp3 playlist downloader