Відмінності між версіями «Group by»

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][перевірена версія]
м (правопис, меташаблони)
 
Рядок 3: Рядок 3:
 
== Приклади ==
 
== Приклади ==
 
Нехай є таблиця статей, для кожної з яких з-поміж іншого зберігається рік їх написання. Потрібно отримати огляд того, скільки статей було написано кожного року.
 
Нехай є таблиця статей, для кожної з яких з-поміж іншого зберігається рік їх написання. Потрібно отримати огляд того, скільки статей було написано кожного року.
<source lang="sql">
+
{{syntaxhighlight|lang=sql|
 
SELECT year, count(1)
 
SELECT year, count(1)
 
FROM articles
 
FROM articles
 
GROUP BY year;
 
GROUP BY year;
  +
}}
</source>
 
  +
 
Результат може бути таким:
 
Результат може бути таким:
 
{|class="wikitable"
 
{|class="wikitable"
Рядок 24: Рядок 25:
 
=== GROUP BY та агрегатні функції ===
 
=== GROUP BY та агрегатні функції ===
 
{{Див. також|Агрегатна функція}}
 
{{Див. також|Агрегатна функція}}
Використання <code>GROUP BY</code> дозволяє застосовувати агрегатні функції. Найчастіше використовується для підрахунку кількості записів, відповідних кожному значенню іншого стовпця (у вищенаведеному прикладі року), часто також суми, [[Середнє арифметичне|середнього арифметичного]] та інших [[Статистична оцінка|статистичних оцінок]] вибраних записів.
+
Використання {{code|GROUP BY|sql}} дозволяє застосовувати агрегатні функції. Найчастіше використовується для підрахунку кількості записів, відповідних кожному значенню іншого стовпця (у вищенаведеному прикладі року), часто також суми, [[Середнє арифметичне|середнього арифметичного]] та інших [[Статистична оцінка|статистичних оцінок]] вибраних записів.
   
 
=== HAVING ===
 
=== HAVING ===
 
{{Див. також|Having (SQL)}}
 
{{Див. також|Having (SQL)}}
У випадках, коли вибірку з <code>GROUP BY</code> необхідно додатково обмежити, а використовувати оператор [[Where (SQL)|WHERE]] не можна, оскільки він не працює з агрегатними функціями, необхідно використовувати спеціальне ключове слово <code>HAVING</code>, яке дозволяє задавати умови над агрегатними функціями.
+
У випадках, коли вибірку з {{code|GROUP BY|sql}} необхідно додатково обмежити, а використовувати оператор [[Where (SQL)|WHERE]] не можна, оскільки він не працює з агрегатними функціями, необхідно використовувати спеціальне ключове слово {{code|HAVING|sql}}, яке дозволяє задавати умови над агрегатними функціями.
   
 
=== WITH ROLLUP ===
 
=== WITH ROLLUP ===
Деякі системи керування базами даних (наприклад, [[MySQL]] та [[MariaDB]]<ref>https://mariadb.com/kb/en/mariadb/select-with-rollup/</ref>) підтримують конструкцію <code>WITH ROLLUP</code>, що вживається з оператором <code>GROUP BY</code>. Запит із конструкцією <code>WITH ROLLUP</code> поверне, згідно зі стандартом, рядки зі значенням [[Null (SQL)|NULL]] у тих стовпцях, відповідно до яких дані агрегуються (якщо вказані), а на місці значень агрегатних функцій&nbsp;— результати цих функцій для всіх рядків&nbsp;— наприклад, для кількості (<code>count</code>) це кількість усіх входжень, для суми (<code>sum</code>)&nbsp;— загальна сума і&nbsp;т.&nbsp;д.
+
Деякі системи керування базами даних (наприклад, [[MySQL]] та [[MariaDB]]<ref>https://mariadb.com/kb/en/mariadb/select-with-rollup/</ref>) підтримують конструкцію {{code|WITH ROLLUP|sql}}, що вживається з оператором {{code|GROUP BY|sql}}. Запит із конструкцією {{code|WITH ROLLUP|sql}} поверне, згідно зі стандартом, рядки зі значенням [[Null (SQL)|NULL]] у тих стовпцях, відповідно до яких дані агрегуються (якщо вказані), а на місці значень агрегатних функцій&nbsp;— результати цих функцій для всіх рядків&nbsp;— наприклад, для кількості ({{code|count|sql}}) це кількість усіх входжень, для суми ({{code|sum|sql}})&nbsp;— загальна сума і&nbsp;т.&nbsp;д.
   
 
Для вищенаведеного прикладу запиту
 
Для вищенаведеного прикладу запиту
<source lang="sql">
+
{{syntaxhighlight|lang=sql|
 
SELECT year, count(1)
 
SELECT year, count(1)
 
FROM articles
 
FROM articles
 
GROUP BY ROLLUP (year);
 
GROUP BY ROLLUP (year);
  +
}}
</source>
 
  +
 
результат буде схожий на:
 
результат буде схожий на:
 
{|class="wikitable"
 
{|class="wikitable"
Рядок 53: Рядок 55:
 
|}
 
|}
   
Значення [[Null (SQL)|NULL]] в останньому рядку представляє загальний показник за всі роки. Агрегованих стовпців або виразів може бути й більше&nbsp;— тоді результатний набір міститиме значення NULL із загальною сумою у зворотньому порядку, крім зазначених в операторі <code>GROUP BY</code>.
+
Значення [[Null (SQL)|NULL]] в останньому рядку представляє загальний показник за всі роки. Агрегованих стовпців або виразів може бути й більше&nbsp;— тоді результатний набір міститиме значення NULL із загальною сумою у зворотному порядку, крім зазначених в операторі {{code|GROUP BY|sql}}.
   
 
== Примітки ==
 
== Примітки ==

Поточна версія на 13:47, 13 травня 2019

GROUP BY — синтаксична конструкція мови SQL для агрегації записів, вибраних за допомогою запиту SELECT.

Приклади[ред. | ред. код]

Нехай є таблиця статей, для кожної з яких з-поміж іншого зберігається рік їх написання. Потрібно отримати огляд того, скільки статей було написано кожного року.

SELECT year, count(1)
FROM articles
GROUP BY year;

Результат може бути таким:

year count(1)
2006 7
2007 15
2008 22

Інші можливості[ред. | ред. код]

GROUP BY та агрегатні функції[ред. | ред. код]

Використання GROUP BY дозволяє застосовувати агрегатні функції. Найчастіше використовується для підрахунку кількості записів, відповідних кожному значенню іншого стовпця (у вищенаведеному прикладі року), часто також суми, середнього арифметичного та інших статистичних оцінок вибраних записів.

HAVING[ред. | ред. код]

Див. також: Having (SQL)

У випадках, коли вибірку з GROUP BY необхідно додатково обмежити, а використовувати оператор WHERE не можна, оскільки він не працює з агрегатними функціями, необхідно використовувати спеціальне ключове слово HAVING, яке дозволяє задавати умови над агрегатними функціями.

WITH ROLLUP[ред. | ред. код]

Деякі системи керування базами даних (наприклад, MySQL та MariaDB[1]) підтримують конструкцію WITH ROLLUP, що вживається з оператором GROUP BY. Запит із конструкцією WITH ROLLUP поверне, згідно зі стандартом, рядки зі значенням NULL у тих стовпцях, відповідно до яких дані агрегуються (якщо вказані), а на місці значень агрегатних функцій — результати цих функцій для всіх рядків — наприклад, для кількості (count) це кількість усіх входжень, для суми (sum) — загальна сума і т. д.

Для вищенаведеного прикладу запиту

SELECT year, count(1)
FROM articles
GROUP BY ROLLUP (year);

результат буде схожий на:

year count(1)
2006 7
2007 15
2008 22
NULL 44

Значення NULL в останньому рядку представляє загальний показник за всі роки. Агрегованих стовпців або виразів може бути й більше — тоді результатний набір міститиме значення NULL із загальною сумою у зворотному порядку, крім зазначених в операторі GROUP BY.

Примітки[ред. | ред. код]

Посилання[ред. | ред. код]