Команда GROUP BY — группировка при выборке из базы данных
Команда GROUP BY позволяет группировать результаты при выборке из базы данных.
К сгруппированным результатам можно применять любые функции (смотрите примеры).
См. также команду HAVING, которая позволяет накладывать условие на группы, созданные с помощью GROUP BY.
Синтаксис
SELECT * FROM имя_таблицы WHERE условие GROUP BY поле_для_группировки
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 100 |
2 | Петя | 23 | 200 |
3 | Вася | 23 | 300 |
4 | Коля | 24 | 1000 |
5 | Иван | 24 | 2000 |
6 | Кирилл | 1000 |
Пример
В данном примере записи группируются по возрасту (будет 3 группы — 23 года, 24 года и 25 лет). Затем для каждой группы применяется функция SUM, которая суммирует зарплаты внутри данной группы.
В результате для каждой из групп (23 года, 24 года и 25 лет) будет подсчитана суммарная зарплата внутри этой группы:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 600 |
24 | 3000 |
25 | 1000 |
Пример
SELECT age, SUM(salary) as sum FROM workers WHERE id>=2 GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 500 |
24 | 3000 |
25 | 1000 |
Пример
В данном примере записи группируются по возрасту (будет 3 группы — 23 года, 24 года и 25 лет). Затем для каждой группы применяется функция MAX, которая находит максимальную зарплату внутри данной группы:
SELECT age, MAX(salary) as max FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | max максимальная зарплата |
---|---|
23 | 300 |
24 | 2000 |
25 | 1000 |
Пример
А теперь с помощью функции MIN найдется минимальная зарплата внутри данной группы:
SELECT age, MIN(salary) as min FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | min минимальная зарплата |
---|---|
100 | |
24 | 1000 |
25 | 1000 |
Пример
А теперь с помощью функции COUNT найдется количество записей в группе:
SELECT age, COUNT(*) as count FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
23 | 3 |
24 | 2 |
25 | 1 |
← Предыдущая страница Следующая страница →
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_id year_released 1 2011 2 2008 NULL 2008 NULL 2010 8 2007 6 2007 6 2007 8 2005 NULL 2012 7 1920 8 NULL 8 1920
Приведенный выше результат имеет много дубликатов.
Давайте выполним тот же запрос, используя group by –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Выполнение вышеупомянутого сценария в MySQL Workbench против myflixdb дает нам следующие результаты, показанные ниже.
category_id year_released NULL 2008 NULL 2010 NULL 2012 1 2011 2 2008 6 2007 7 1920 8 1920 8 2005 8 2007
Предложение GROUP BY действует как для идентификатора категории, так и для года выпуска, чтобы идентифицировать уникальные строки в нашем примере выше.
Если идентификатор категории совпадает, но выпущенный год отличается, то строка считается уникальной. Если идентификатор категории и выпущенный год совпадают для более чем одной строки, то это считается дубликатом и только одной строкой. Показано.
Группировка и
агрегирование функцийПредположим, мы хотим, чтобы общее количество мужчин и женщин в нашей базе данных. Мы можем использовать следующий скрипт, показанный ниже, чтобы сделать это.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Выполнение вышеуказанного скрипта в MySQL Workbench против myflixdb дает нам следующие результаты.
gender COUNT('membership_number') Female 3 Male 5
Результаты, показанные ниже, сгруппированы по каждому опубликованному уникальному гендерному значению, а количество сгруппированных строк подсчитывается с помощью агрегатной функции COUNT.
Ограничение результатов запроса с помощью предложения
HAVINGНе всегда мы хотим выполнить группировку для всех данных в данной таблице.
Предположим, мы хотим знать все годы выпуска для идентификатора категории фильма 8. Мы будем использовать следующий скрипт для достижения наших результатов.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Выполнение вышеупомянутого сценария в MySQL Workbench против Myflixdb дает нам следующие результаты, показанные ниже.
movie_id title director year_released category_id 9 Honey mooners John Schultz 2005 8 5 Daddy's Little Girls NULL 2007 8
Обратите внимание, что наше предложение GROUP BY затронуло только фильмы с идентификатором категории 8.
Резюме
- Предложение GROUP BY используется для группировки строк с одинаковыми значениями.
- Предложение GROUP BY используется вместе с оператором SQL SELECT.
- Оператор SELECT, используемый в предложении GROUP BY, может использоваться только с именами столбцов, агрегатными функциями, константами и выражениями.
- Предложение HAVING используется для ограничения результатов, возвращаемых предложением GROUP BY.
GROUP BY в MySQL — W3schools
by
MySQL GROUP BY
В MySQL предложение GROUP BY используется с оператором SELECT для группировки полученных данных по одному или нескольким столбцам.
Синтаксис: Для группировки строк по значениям в нескольких столбцах.
SELECT выражения ОТ имя_таблицы СГРУППИРОВАТЬ ПО столбцам;
Параметры:
выражений: Используется для указания столбцов или вычислений, которые необходимо получить.
имя_таблицы: Используется для указания имени таблицы для извлечения записей.
столбцы: Используется для указания списка столбцов, которые необходимо сгруппировать.
Пример:
Таблица позиций:
ID | НАИМЕНОВАНИЕ | КОЛИЧЕСТВО |
1 | Электроника | 30 |
Спорт | 45 | |
3 | Мода | 50 | 4 | Бакалея | 30 |
5 | Игрушки | 50 900 51 |
Запрос:
ВЫБЕРИТЕ количество ИЗ элементов СГРУППИРОВАТЬ ПО количеству; |
Выход:
КОЛИЧЕСТВО 30 45 50
Объяснение:
«Элементы» — это уже существующая таблица, из которой мы извлекаем уникальные значения «количества».
Синтаксис: MySQL GROUP BY с предложением WHERE.
SELECT выражения ОТ имя_таблицы ГДЕ условия СГРУППИРОВАТЬ ПО столбцам;
Параметры:
условия: Используется для указания условий, которым необходимо строго следовать при выборе.
Пример:
Таблица товаров:
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 Запрос: Выход: Объяснение: Пример 2. MySQL GROUP BY с функцией SUM0051 Запрос: Выход: Объяснение: Пожалуйста, поделитесь спросил Изменено
10 месяцев назад Просмотрено
22к раз У меня был этот запрос: Результат: Но я хочу знать, как показать неделю, как «красивее», что-то вроде: 0 Вы можете выполнить это с помощью функции DATE_FORMAT, 0 Принятое решение не сработало для меня, так как оно не группируется по неделям, но может получать строки в течение одной недели, например: Использование подзапроса работает: 1 Чтобы сгруппировать по неделям и отобразить первый день недели, вы можете сделать, как показано. НАИМЕНОВАНИЕ КОЛИЧЕСТВО 1 Электроника 30 2 Спорт 45 3 90 048 Мода 50 4 Бакалея 30 5 Игрушки 50 ВЫБЕРИТЕ количество, COUNT(*) AS «Число Предметы"
ИЗ элементов
СГРУППИРОВАТЬ ПО количеству;
КОЛИЧЕСТВО Количество позиций 30 2 45 1 50 2
«Элементы» — это уже существующая таблица, из которой мы считаем количество Товаров одного и того же значения количества. НАИМЕНОВАНИЕ КОЛИЧЕСТВО 1 Электроника 30 9 0051 2 Спорт 45 3 Мода 9 0048 100 4 Электроника 90 5 Спорт 900 48 50 ВЫБЕРИТЕ имя, СУММА(количество) КАК «Количество»
ИЗ элементов
СГРУППИРОВАТЬ ПО имени;
ИМЯ КОЛИЧЕСТВО Электроника 120 Спорт 95 Мода 900 48 100
«Предметы» — это уже существующая таблица, из которой мы вычисляем сумму количеств для каждого уникального имени предмета. mysql — Сгруппировать по НЕДЕЛЯм, но показать более читаемый результат?
ВЫБЕРИТЕ ГОД (дата-время) КАК Год, НЕДЕЛЯ (дата-время) КАК неделя, СЧЕТЧИК (*) КАК всего
ИЗ таблицы
СГРУППИРОВАТЬ ПО Году, Неделе;
+------+------+-------+
| Год | неделя | всего |
+------+------+-------+
| 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 |
+------+----------+-------+
SELECT YEAR(datetime) AS Year, DATE_FORMAT(datetime, '%b %e') AS Week, COUNT(*) AS total
ИЗ таблицы
СГРУППИРОВАТЬ ПО Году, Неделе;
год, неделя, итог
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;