ГРУППИРОВКА ПО
Используйте предложение GROUP BY в операторе SELECT, чтобы сгруппировать строки, имеющие одинаковые значения в одном или нескольких столбцах, или одинаковые вычисленные значения с использованием выражений с любыми функциями и операторами, кроме функций группировки. При использовании предложения GROUP BY, вы получите одну строку результата для каждой группы строк, имеющих одинаковое значение для выражения, указанного в GROUP BY.
При группировке строк, значения группировки сравниваются так, как если бы они сравнивались с помощью оператора =. Для строковых значений оператор = игнорирует хвостовые пробелы и может нормализовать символы и игнорировать регистр в зависимости от используемой коллизии.
Вы можете использовать любые функции группировки в своем выражении select. Их значения будут вычисляться на основе всех строк, которые были сгруппированы вместе для каждой строки результата. Если вы выбираете не сгруппированный столбец или значение, вычисленное из несгруппированного столбца, то неясно, из какой строки взято возвращаемое значение. Это не разрешено, если используется ONLY_FULL_GROUP_BY SQL_MODE.
Вы можете использовать несколько выражений в предложении GROUP BY, разделенных запятыми. Строки группируются вместе, если они совпадают по каждому из выражений.
Вы также можете использовать целое число в качестве выражения группировки. Если вы используете целое число n, результаты будут сгруппированы по n-ому столбцу в выражении select.
Предложение WHERE применяется до предложения GROUP BY. Оно фильтрует строки, не относящиеся к агрегированным, прежде чем строки будут сгруппированы вместе. Для фильтрации сгруппированных строк на основе агрегированных значений используйте предложение HAVING. Предложение HAVING принимает любое выражение и оценивает его как булево значение, как и предложение WHERE. Вы можете использовать функции группировки в предложении HAVING. Как и в выражении select, если вы ссылаетесь на несгруппированные столбцы в предложении HAVING, поведение неопределенно.
По умолчанию, если присутствует предложение GROUP BY , строки в выводе будут отсортированы по выражениям, используемым в GROUP BY. Вы также можете указать ASC или DESC (по возрастанию, по убыванию) после этих выражений, как в ORDER BY. По умолчанию используется ASC.
Если вы хотите отсортировать строки по другому полю, вы можете добавить явное ORDER BY. Если вы не хотите, чтобы результат был упорядочен, вы можете добавить ORDER BY NULL.
С ROLLUP
Модификатор WITH ROLLUP добавляет дополнительные строки в набор результатов, которые представляют сводные данные для супер-агрегирования. Полное описание с примерами см. в SELECT WITH ROLLUP.
Примеры GROUP BY
Рассмотрим следующую таблицу, которая регистрирует, сколько раз каждый пользователь играл и выигрывал в игру:
CREATE TABLE plays (name VARCHAR(16), plays INT, wins INT);
INSERT INTO plays VALUES
("John", 20, 5),
("Robert", 22, 8),
("Wanda", 32, 8),
("Susan", 17, 3);
Получить список количества побед вместе с подсчетом:
SELECT wins, COUNT(*) FROM plays GROUP BY wins; +------+----------+ | wins | COUNT(*) | +------+----------+ | 3 | 1 | | 5 | 1 | | 8 | 2 | +------+----------+ 3 rows in set (0.00 sec)
Выражение GROUP BY может быть вычисленным значением и может ссылаться на идентификатор, указанный с помощью AS. Получить список средних значений побед вместе с подсчетом:
SELECT (wins / plays) AS winavg, COUNT(*) FROM plays GROUP BY winavg; +--------+----------+ | winavg | COUNT(*) | +--------+----------+ | 0.1765 | 1 | | 0.2500 | 2 | | 0.3636 | 1 | +--------+----------+ 3 rows in set (0.00 sec)
Вы можете использовать любые функции группировки в выражении select. Для каждого среднего значения побед, как выше, получить список среднего количества игр, взятых для получения этого среднего значения:
SELECT (wins / plays) AS winavg, AVG(plays) FROM plays GROUP BY winavg; +--------+------------+ | winavg | AVG(plays) | +--------+------------+ | 0.1765 | 17.0000 | | 0.2500 | 26.0000 | | 0.3636 | 22.0000 | +--------+------------+ 3 rows in set (0.00 sec)
Вы можете фильтровать по агрегированной информации, используя предложение HAVING. Предложение HAVING применяется после GROUP BY и позволяет фильтровать агрегированные данные, которые недоступны предложению WHERE. Ограничьте приведенный выше пример результатами, которые включают среднее количество игр более 20:
SELECT (wins / plays) AS winavg, AVG(plays) FROM plays GROUP BY winavg HAVING AVG(plays) > 20; +--------+------------+ | winavg | AVG(plays) | +--------+------------+ | 0.2500 | 26.0000 | | 0.3636 | 22.0000 | +--------+------------+ 2 rows in set (0.00 sec)
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/group-by/