Команда GROUP BY — группировка при выборке из базы данных

Команда GROUP BY позволяет группировать результаты при выборке из базы данных.

К сгруппированным результатам можно применять любые функции (смотрите примеры).

См. также команду HAVING, которая позволяет накладывать условие на группы, созданные с помощью GROUP BY.

Синтаксис

SELECT * FROM имя_таблицы WHERE условие GROUP BY поле_для_группировки

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1Дима23100
2Петя23200
3Вася23300
4Коля241000
5Иван242000
6Кирилл
25
1000

Пример

В данном примере записи группируются по возрасту (будет 3 группы — 23 года, 24 года и 25 лет). Затем для каждой группы применяется функция SUM, которая суммирует зарплаты внутри данной группы.

В результате для каждой из групп (23 года, 24 года и 25 лет) будет подсчитана суммарная зарплата внутри этой группы:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
23600
243000
251000

Пример

В данном примере мы используем дополнительное условие WHERE, чтобы взять не все записи из таблицы:

SELECT age, SUM(salary) as sum FROM workers WHERE id>=2 GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
23500
243000
251000

Пример

В данном примере записи группируются по возрасту (будет 3 группы — 23 года, 24 года и 25 лет). Затем для каждой группы применяется функция MAX, которая находит максимальную зарплату внутри данной группы:

SELECT age, MAX(salary) as max FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
max
максимальная зарплата
23300
242000
251000

Пример

А теперь с помощью функции MIN найдется минимальная зарплата внутри данной группы:

SELECT age, MIN(salary) as min FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
min
минимальная зарплата
23
100
241000
251000

Пример

А теперь с помощью функции COUNT найдется количество записей в группе:

SELECT age, COUNT(*) as count FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
count
количество
233
242
251

← Предыдущая страница Следующая страница →

13) GROUP BY — CoderLessons.

com

Что такое группировка по пунктам?

Предложение GROUP BY – это команда SQL, которая используется для группировки строк с одинаковыми значениями .

 Предложение GROUP BY используется в операторе SELECT. Опционально оно используется в сочетании с агрегатными функциями для создания сводных отчетов из базы данных.

Вот что он делает, суммируя данные из базы данных.

Запросы, содержащие предложение GROUP BY, называются сгруппированными запросами и возвращают только одну строку для каждого сгруппированного элемента.

 

Синтаксис GROUP BY

Теперь, когда мы знаем, что такое предложение GROUP By, давайте посмотрим на синтаксис для базовой группы по запросу.

SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];

ВОТ

  • «Операторы SELECT …» – это стандартный запрос команды SQL SELECT.
  • « GROUP BY column_name1 » – это предложение, которое выполняет группировку на основе column_name1.
  • «[, column_name2, …]» необязательно; представляет другие имена столбцов, когда группировка выполняется по нескольким столбцам.
  •  «[HAVING условие]» необязательно; он используется для ограничения строк, затронутых предложением GROUP BY. Это похоже на предложение WHERE.

Группировка с использованием одного столбца

Чтобы понять влияние предложения Group By, выполним простой запрос, который возвращает все записи пола из таблицы members.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Предположим, мы хотим получить уникальные значения для полов. Мы можем использовать следующий запрос –

SELECT `gender` FROM `members` GROUP BY `gender`;

Выполнение вышеупомянутого сценария в MySQL Workbench против Myflixdb дает нам следующие результаты.

gender
Female
Male

Обратите внимание, только два результата были возвращены. Это потому, что у нас есть только два типа пола: мужской и женский. Предложение GROUP BY сгруппировало всех «мужских» членов вместе и вернуло только одну строку для него. То же самое было и с «женщинами».

Группировка с использованием

нескольких столбцов

Предположим, что мы хотим получить список фильмов category_id и соответствующих лет, в которые они были выпущены.

Давайте посмотрим на вывод этого простого запроса

SELECT `category_id`,`year_released` FROM `movies` ;
category_idyear_released
12011
22008
NULL2008
NULL2010
82007
62007
62007
82005
NULL2012
71920
8NULL
81920

Приведенный выше результат имеет много дубликатов.

Давайте выполним тот же запрос, используя group by –

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

Выполнение вышеупомянутого сценария в MySQL Workbench против myflixdb дает нам следующие результаты, показанные ниже.

category_idyear_released
NULL2008
NULL2010
NULL2012
12011
22008
62007
71920
81920
82005
82007

Предложение GROUP BY действует как для идентификатора категории, так и для года выпуска, чтобы идентифицировать уникальные строки в нашем примере выше.

Если идентификатор категории совпадает, но выпущенный год отличается, то строка считается уникальной. Если идентификатор категории и выпущенный год совпадают для более чем одной строки, то это считается дубликатом и только одной строкой. Показано.

Группировка и

агрегирование функций

Предположим, мы хотим, чтобы общее количество мужчин и женщин в нашей базе данных. Мы можем использовать следующий скрипт, показанный ниже, чтобы сделать это.

SELECT `gender`,COUNT(`membership_number`)  FROM `members` GROUP BY `gender`;

 

Выполнение вышеуказанного скрипта в MySQL Workbench против myflixdb дает нам следующие результаты.

genderCOUNT('membership_number')
Female3
Male5

Результаты, показанные ниже, сгруппированы по каждому опубликованному уникальному гендерному значению, а количество сгруппированных строк подсчитывается с помощью агрегатной функции COUNT.

Ограничение результатов запроса с помощью предложения

HAVING

Не всегда мы хотим выполнить группировку для всех данных в данной таблице.

Будут времена, когда мы захотим ограничить наши результаты определенным заданным критерием. В таких случаях мы можем использовать предложение HAVING

Предположим, мы хотим знать все годы выпуска для идентификатора категории фильма 8. Мы будем использовать следующий скрипт для достижения наших результатов.

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

Выполнение вышеупомянутого сценария в MySQL Workbench против Myflixdb дает нам следующие результаты, показанные ниже.

movie_idtitledirectoryear_releasedcategory_id
9Honey moonersJohn Schultz20058
5Daddy's Little GirlsNULL20078

Обратите внимание, что наше предложение GROUP BY затронуло только фильмы с идентификатором категории 8.

 

Резюме

  • Предложение GROUP BY используется для группировки строк с одинаковыми значениями.
  • Предложение GROUP BY используется вместе с оператором SQL SELECT.
  • Оператор SELECT, используемый в предложении GROUP BY, может использоваться только с именами столбцов, агрегатными функциями, константами и выражениями.
  • Предложение HAVING используется для ограничения результатов, возвращаемых предложением GROUP BY.

 

 

GROUP BY в MySQL — W3schools

MySQL GROUP BY
В MySQL предложение GROUP BY используется с оператором SELECT для группировки полученных данных по одному или нескольким столбцам.

Синтаксис: Для группировки строк по значениям в нескольких столбцах.

 SELECT выражения
ОТ имя_таблицы
СГРУППИРОВАТЬ ПО столбцам;
 

Параметры:
выражений: Используется для указания столбцов или вычислений, которые необходимо получить.
имя_таблицы: Используется для указания имени таблицы для извлечения записей.
столбцы: Используется для указания списка столбцов, которые необходимо сгруппировать.

Пример:
Таблица позиций:

90 048 2 90 047
ID
НАИМЕНОВАНИЕ КОЛИЧЕСТВО
1 Электроника 30
Спорт 45
3 Мода 50
4 Бакалея 30
5 Игрушки 50 900 51

Запрос:

 ВЫБЕРИТЕ количество
ИЗ элементов
СГРУППИРОВАТЬ ПО количеству; 

Выход:

 КОЛИЧЕСТВО
30
45
50
 

Объяснение:
«Элементы» — это уже существующая таблица, из которой мы извлекаем уникальные значения «количества».

Синтаксис: MySQL GROUP BY с предложением WHERE.

 SELECT выражения
ОТ имя_таблицы
ГДЕ условия
СГРУППИРОВАТЬ ПО столбцам;
 

Параметры:
условия: Используется для указания условий, которым необходимо строго следовать при выборе.

Пример:
Таблица товаров:

900 48 2 9 0048 4
ID НАЗВАНИЕ КОЛИЧЕСТВО
1 Электроника 30
Спорт 45
3 Мода 50
Бакалея 30
5 Игрушки 50

Запрос:

 ВЫБЕРИТЕ количество
ИЗ элементов
ГДЕ количество > 30
СГРУППИРОВАТЬ ПО количеству; 

Выход:

 КОЛИЧЕСТВО
45
50
 

Объяснение:
«Элементы» — это уже существующая таблица, из которой мы извлекаем уникальные значения «количества», превышающего 30.

Синтаксис: MySQL GROUP BY с агрегатной функцией.

 Выражения SELECT, агрегатная_функция (агрегатное_выражение)
ОТ имя_таблицы
ГДЕ условия
СГРУППИРОВАТЬ ПО столбцам; 

Параметры:
Aggregate_function: Используется для указания агрегатной функции.
Aggregate_expression: Используется для указания столбца или выражения, которые будут использоваться агрегатной функцией.

Пример 1: MySQL GROUP BY с функцией COUNT НАИМЕНОВАНИЕ КОЛИЧЕСТВО 1 Электроника 30 2 Спорт 45 3 90 048 Мода 50 4 Бакалея 30 5 Игрушки 50

Запрос:

 ВЫБЕРИТЕ количество, COUNT(*) AS «Число Предметы"
ИЗ элементов
СГРУППИРОВАТЬ ПО количеству; 

Выход:

 

КОЛИЧЕСТВО Количество позиций
30 2
45 1
50 2

Объяснение:
«Элементы» — это уже существующая таблица, из которой мы считаем количество Товаров одного и того же значения количества.

Пример 2. MySQL GROUP BY с функцией SUM0051 НАИМЕНОВАНИЕ КОЛИЧЕСТВО 1 Электроника 30 9 0051 2 Спорт 45 3 Мода 9 0048 100 4 Электроника 90 5 Спорт 900 48 50

Запрос:

 ВЫБЕРИТЕ имя, СУММА(количество) КАК «Количество»
ИЗ элементов
СГРУППИРОВАТЬ ПО имени; 

Выход:

900 48 100
ИМЯ КОЛИЧЕСТВО
Электроника 120
Спорт 95
Мода

Объяснение:
«Предметы» — это уже существующая таблица, из которой мы вычисляем сумму количеств для каждого уникального имени предмета.

Пожалуйста, поделитесь

mysql — Сгруппировать по НЕДЕЛЯм, но показать более читаемый результат?

спросил

Изменено 10 месяцев назад

Просмотрено 22к раз

У меня был этот запрос:

 ВЫБЕРИТЕ ГОД (дата-время) КАК Год, НЕДЕЛЯ (дата-время) КАК неделя, СЧЕТЧИК (*) КАК всего
ИЗ таблицы
СГРУППИРОВАТЬ ПО Году, Неделе;
 

Результат:

 +------+------+-------+
| Год | неделя | всего |
+------+------+-------+
| 2016 | 49 | 14 |
| 2016 | 50 | 20 |
| 2016 | 51 | 19 |
| 2016 | 52 | 15 |
| 2017 | 1 | 13 |
| 2017 | 2 | 14 |
| 2017 | 3 | 12 |
| 2017 | 4 | 12 |
| 2017 | 5 | 5
 

Но я хочу знать, как показать неделю, как «красивее», что-то вроде:

 +------+----------+-------+
| Год | неделя | всего |
+------+----------+-------+
| 2016 | 05 декабря | 14 |
| 2016 | 12 декабря | 20 |
| 2016 | 19 декабря | 19 |
| 2016 | 26 декабря | 15 |
| 2017 | 02 января | 13 |
| 2017 | 09 января | 14 |
| 2017 | 16 января | 12 |
| 2017 | 23 января | 12 |
| 2017 | 30 января | 5 |
+------+----------+-------+
 
  • mysql
  • оптимизация

0

Вы можете выполнить это с помощью функции DATE_FORMAT,

 SELECT YEAR(datetime) AS Year, DATE_FORMAT(datetime, '%b %e') AS Week, COUNT(*) AS total
ИЗ таблицы
СГРУППИРОВАТЬ ПО Году, Неделе;
 

0

Принятое решение не сработало для меня, так как оно не группируется по неделям, но может получать строки в течение одной недели, например:

 год, неделя, итог
2021, 23, 1 мар
2021, 24 мар, 2
 

Использование подзапроса работает:

 ВЫБОР
    ГОД(ADDDATE(your_datetime, INTERVAL 1-DAYOFWEEK(your_datetime) DAY)) год,
    DATE_FORMAT(ADDDATE(your_datetime, INTERVAL 1-DAYOFWEEK(your_datetime) DAY), '%b %e') неделя,
    общий
ОТ
    (ВЫБИРАТЬ
        YEAR(your_datetime) КАК год,
            WEEK(your_datetime) КАК неделя,
            COUNT(*) КАК всего,
            your_datetime
    ОТ
        ваша_таблица
    GROUP BY `your_datetime`) AS sub;
 

1

Чтобы сгруппировать по неделям и отобразить первый день недели, вы можете сделать, как показано.