Команда 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 | Кирилл | 25 | 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 |
Пример
В данном примере мы используем дополнительное условие WHERE, чтобы взять не все записи из таблицы:
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 |
Пример
SELECT age, MIN(salary) as min FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | min минимальная зарплата |
---|---|
23 | 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 |
SQL оператор GROUP BY — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном материале вы узнаете, как использовать SQL оператор GROUP BY с синтаксисом и примерами.
Описание
SQL оператор GROUP BY можно использовать в операторе SELECT для сбора данных по нескольким записям и группировки результатов по одному или нескольким столбцам.
Синтаксис
Синтаксис оператора GROUP BY в SQL:
SELECT expression1, expression2, … expression_n,
aggregate_function (aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, … expression_n
[ORDER BY expression [ ASC | DESC ]];
Параметры или аргументы
- expression1, expression2, … expression_n
- Выражения, которые не инкапсулированы в агрегатную функцию и должны быть включены в GROUP BY в конце SQL-запроса.
- aggregate_function
- Это агрегатная функция, такая как SUM, COUNT, MIN, MAX или AVG.
- aggregate_expression
- Это столбец или выражение, для которого будет использоваться aggregate_function.
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица.
- WHERE conditions
- Необязательный. Это условия, которые должны быть выполнены для выбора записей.
- ORDER BY expression
- Необязательный. Выражение, используемое для сортировки записей в наборе результатов. Если указано более одного выражения, значения должны быть разделены запятыми.
- ASC
- Необязательный. ASC сортирует результирующий набор в порядке возрастания по expression. Это поведение по умолчанию, если модификатор не указан.
- DESC
- Необязательный. DESC сортирует результирующий набор в порядке убывания по expression.
Пример — использование GROUP BY с функцией SUM
Давайте посмотрим, как использовать GROUP BY с функцией SUM в SQL.
В этом примере у нас есть таблица employees со следующими данными:
employee_number | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1001 | Justin | Bieber | 62000 | 500 |
1002 | Selena | Gomez | 57500 | 500 |
1003 | Mila | Kunis | 71000 | 501 |
1004 | Tom | Cruise | 42000 | 501 |
Введите следующий SQL оператор:
SELECT dept_id, SUM(salary) AS total_salaries FROM employees GROUP BY dept_id;
SELECT dept_id, SUM(salary) AS total_salaries FROM employees GROUP BY dept_id; |
Будет выбрано 2 записи. Вот результаты, которые вы получите:
dept_id | total_salaries |
---|---|
500 | 119500 |
501 | 113000 |
В этом примере мы использовали функцию SUM, чтобы сложить все зарплаты для каждого dept_id, и мы результатам SUM(salary) указали псевдоним «total_salaries». Поскольку dept_id не инкапсулирован в функцию SUM, он должен быть указан в предложении GROUP BY.
Пример — использование GROUP BY с функцией COUNT
Давайте посмотрим, как использовать предложение GROUP BY с функцией COUNT в SQL.
В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Введите следующий SQL оператор:
SELECT category_id, COUNT(*) AS total_products FROM products WHERE category_id IS NOT NULL GROUP BY category_id ORDER BY category_id;
SELECT category_id, COUNT(*) AS total_products FROM products WHERE category_id IS NOT NULL GROUP BY category_id ORDER BY category_id; |
Будет выбрано 3 записи. Вот результаты, которые вы должны получить:
category_id | total_products |
---|---|
25 | 1 |
50 | 4 |
75 | 1 |
В этом примере мы использовали функцию COUNT для вычисления количества total_products для каждого category_id, и мы указали псевдоним «total_products» как результаты функции COUNT. Мы исключили все значения category_id, которые имеют значение NULL, отфильтровав их в предложении WHERE. Поскольку category_id не инкапсулирован в функции COUNT, он должен быть указан в предложении GROUP BY.
Пример — использование GROUP BY с функцией MIN
Давайте теперь посмотрим, как использовать предложение GROUP BY с функцией MIN в SQL.
В этом примере мы снова будем использовать таблицу employees со следующими данными:
employee_number | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1001 | Justin | Bieber | 62000 | 500 |
1002 | Selena | Gomez | 57500 | 500 |
1003 | Mila | Kunis | 71000 | 501 |
1004 | Tom | Cruise | 42000 | 501 |
Введите следующий SQL оператор:
SELECT dept_id, MIN(salary) AS lowest_salary FROM employees GROUP BY dept_id;
SELECT dept_id, MIN(salary) AS lowest_salary FROM employees GROUP BY dept_id; |
Будет выбрано 2 записи. Вот результаты, которые вы получите:
dept_id | lowest_salary |
---|---|
500 | 57500 |
501 | 42000 |
В этом примере мы использовали функцию MIN, чтобы вернуть самое минимальное значение salary для каждого dept_id, и мы присвоили результатам функции MIN псевдоним «lowest_salary». Поскольку dept_id не инкапсулирован в функцию MIN, он должен быть указан в предложении GROUP BY.
Пример — использование GROUP BY с функцией MAX
Наконец, давайте посмотрим, как использовать предложение GROUP BY с функцией MAX.
Давайте снова воспользуемся таблицей employees, но на этот раз найдем самую максимальную зарплату для каждого dept_id:
employee_number | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1001 | Justin | Bieber | 62000 | 500 |
1002 | Selena | Gomez | 57500 | 500 |
1003 | Mila | Kunis | 71000 | 501 |
1004 | Tom | Cruise | 42000 | 501 |
Введите следующий SQL оператор:
SELECT dept_id, MAX(salary) AS highest_salary FROM employees GROUP BY dept_id;
SELECT dept_id, MAX(salary) AS highest_salary FROM employees GROUP BY dept_id; |
Будет выбрано 2 записи. Вот результаты, которые вы должны получить:
dept_id | highest_salary |
---|---|
500 | 62000 |
501 | 71000 |
В этом примере мы использовали функцию MAX, чтобы вернуть самое максимальное значение salary для каждого dept_id, и мы присвоили псевдоним «highest_salary» результату функции MAX. Столбец dept_id должен быть указан в предложении GROUP BY, поскольку он не инкапсулирован в функции MAX.
SQL GROUP BY — группировка в запросах
Оператор SQL GROUP BY служит для распределения строк — результата запроса — по группам, в которых значения некоторого столбца, по которому происходит группировка, являются одинаковыми. Группировку можно производить как по одному столбцу, так и по нескольким.
Часто оператор SQL GROUP BY применяется вместе с агрегатными функциями (COUNT, SUM, AVG, MAX, MIN). В этих случаях агрегатные функции служат для вычисления соответствующего агрегатного значения ко всему набору строк, для которых некоторый столбец — общий.
Оператор GROUP BY имеет следующий синтаксис:
SELECT ИМЕНА_СТОЛБЦОВ FROM ИМЯ_ТАБЛИЦЫ [WHERE УСЛОВИЕ] GROUP BY ИМЕНА_СТОЛБЦОВ
Если в результате запроса требуется вывести один столбец и по этому же столбцу производится группировка, то оператор GROUP BY просто выбирает уникальные значения и убирает дубликаты, то есть выполняет те же задачи, что и ключевое слово DISTINCT.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.
Скрипт для создания базы данных библиотеки, её таблиц и заполения таблиц данными — в файле по этой ссылке.
В примерах работаем с базой данных библиотеки и ее таблицей «Книга в пользовании» (Bookinuse). Отметим, что оператор GROUP BY ведёт себя несколько по-разному в MySQL и в MS SQL Server. Эти различия будут показаны на примерах.
Author | Title | Pubyear | Inv_No | Customer_ID |
Толстой | Война и мир | 2005 | 28 | 65 |
Чехов | Вишневый сад | 2000 | 17 | 31 |
Чехов | Избранные рассказы | 2011 | 19 | 120 |
Чехов | Вишневый сад | 1991 | 5 | 65 |
Ильф и Петров | Двенадцать стульев | 1985 | 3 | 31 |
Маяковский | Поэмы | 1983 | 2 | 120 |
Пастернак | Доктор Живаго | 2006 | 69 | 120 |
Толстой | Воскресенье | 2006 | 77 | 47 |
Толстой | Анна Каренина | 1989 | 7 | 205 |
Пушкин | Капитанская дочка | 2004 | 25 | 47 |
Гоголь | Пьесы | 2007 | 81 | 47 |
Чехов | Избранные рассказы | 1987 | 4 | 205 |
Пушкин | Сочинения, т.1 | 1984 | 6 | 47 |
Пастернак | Избранное | 2000 | 137 | 18 |
Пушкин | Сочинения, т.2 | 1984 | 8 | 205 |
NULL | Наука и жизнь 9 2018 | 2019 | 127 | 18 |
Чехов | Ранние рассказы | 2001 | 171 | 31 |
Пример 1. Вывести авторов выданных книг, сгруппировав их. Пишем следующий запрос:
SELECT Author FROM BOOKINUSE GROUP BY Author
Этот запрос вернёт следующий результат:
Author |
NULL |
Гоголь |
Ильф и Петров |
Маяковский |
Пастернак |
Пушкин |
Толстой |
Чехов |
Как видим, в таблице стало меньше строк, так как фамилии авторов остались каждая по одной.
В следующем примере увидим, что оператор GROUP BY не следует путать с оператором ORDER BY и поймём, чем эти операторы отличаются друг от друга.
Пример 2. Вывести авторов и названия выданных книг, сгруппировав по авторам. Пишем следующий запрос, который допустим в MySQL:
SELECT Author, Title FROM Bookinuse GROUP BY Author
Этот запрос вернёт следующий результат:
Author | Title |
NULL | Наука и жизнь 9 2018 |
Гоголь | Пьесы |
Ильф и Петров | Двенадцать стульев |
Маяковский | Поэмы |
Пастернак | Доктор Живаго |
Пушкин | Капитанская дочка |
Толстой | Война и мир |
Чехов | Вишнёвый сад |
Как видим, в таблице каждому автору соответствует лишь одна книга, причём та, которая в таблице BOOKINUSE является первой по порядку записей.
Если бы нам требовалось вывести все книги, причём авторы должны были бы следовать не «вразброс», а по порядку: сначала Гоголь и все его книги, затем другие авторы и все их книги, то мы применили бы не оператор GROUP BY, а оператор ORDER BY.
По-другому ведёт себя оператор GROUP BY в MS SQL Server.
И всё же вывести все записи, соответствующие значению столбца, по которому происходит группировка, можно. Но в этом случае в результирующей таблице должен появиться ещё один столбец. Такой случай проиллюстирован в следующем примере.
Пример 3. Вывести авторов, названия выданных книг, ID пользователя и инвентарный номер выданной книги. Сгруппировать по авторам, ID пользователя и инвентарному номеру. На MySQL запрос будет следующим:
SELECT Author, Title, Customer_ID, Inv_no FROM Bookinuse GROUP BY Author, Customer_ID, Inv_no
Этот запрос вернёт следующий результат:
Author | Title | Customer_ID | Inv_no |
Гоголь | Пьесы | 47 | 81 |
Ильф и Петров | Двенадцать стульев | 31 | 3 |
Маяковский | Поэмы | 120 | 2 |
Пастернак | Избранное | 18 | 137 |
Пастернак | Доктор Живаго | 120 | 69 |
Пушкин | Капитанская дочка | 47 | 25 |
Пушкин | Сочинения, т.1 | 47 | 6 |
Пушкин | Сочинения, т.2 | 205 | 8 |
Толстой | Воскресенье | 47 | 77 |
Толстой | Война и мир | 65 | 28 |
Толстой | Анна Каренина | 205 | 7 |
Чехов | Вишневый сад | 31 | 19 |
Чехов | Ранние рассказы | 31 | 171 |
Чехов | Вишневый сад | 65 | 5 |
Чехов | Избранные рассказы | 120 | 19 |
Чехов | Избранные рассказы | 205 | 4 |
Как видим, в результирующей таблице присутствуют все книги всех авторов, причём авторы следуют по порядку, как если бы мы применили оператор ORDER BY. Кроме того, видно, что записи сгруппированы и по второму указанному столбцу — Customer_ID. Так, у автора Пушкина сначала перечисляются книги, выданные пользователю с Customer_ID 47, а затем — 205. У автора Чехова сначала перечисляются книги, выданные пользователю с Customer_ID 31, а затем — с другими номерами. Третий столбец, по которому происходит группировка — Inv_no — добавлен только для того, чтобы в результирующей таблице выводились все строки, соответствующие значениям ранее перечисленных столбцов для группировки, а не только уникальные.
По-другому ведёт себя оператор GROUP BY в MS SQL Server и в случае этого запроса.
Агрегатные функции COUNT, SUM, AVG, MAX, MIN служат для вычисления соответствующего агрегатного значения ко всему набору строк, для которых некоторый столбец — общий.
Пример 4. Вывести количество выданных книг каждого автора. Запрос будет следующим:
SELECT Author, COUNT(*) AS InUse FROM Bookinuse GROUP BY Author
Результатом выполнения запроса будет следующая таблица:
Author | InUse |
NULL | 1 |
Гоголь | 1 |
Ильф и Петров | 1 |
Маяковский | 1 |
Пастернак | 2 |
Пушкин | 3 |
Толстой | 3 |
Чехов | 5 |
Пример 5. Вывести количество книг, выданных каждому пользователю. Запрос будет следующим:
SELECT Customer_ID, COUNT(*) AS InUse FROM Bookinuse GROUP BY Customer_ID
Результатом выполнения запроса будет следующая таблица:
User_ID | InUse |
18 | 1 |
31 | 3 |
47 | 4 |
65 | 2 |
120 | 3 |
205 | 3 |
Примеры запросов к базе данных «Библиотека» есть также в уроках по оператору IN, предикату EXISTS и функциям CONCAT, COALESCE.
На сайте есть более подробный материал об агрегатных функциях и их совместном использовании с оператором GROUP BY.
Поделиться с друзьями
Реляционные базы данных и язык SQL
MS SQL Server и T-SQL
Операторы GROUP BY и HAVING
Последнее обновление: 19.07.2017
Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING, для использования которых применяется следующий формальный синтаксис:
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. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.
И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:
SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products
Другой пример, добавим группировку по количеству товаров:
SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount
Оператор GROUP BY
может выполнять группировку по множеству столбцов.
Если столбец, по которому производится группировка, содержит значение NULL, то строки со значением NULL составят отдельную группу.
Следует учитывать, что выражение 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). В конце группы сортируются по количеству товаров по убыванию.
GROUP BY в SQL
Вы здесь: Главная — MySQL — SQL — GROUP BY в SQL
Одной из важных команд в SQL является GROUP BY. Данная конструкция создана для выборки отдельных групп строк из таблицы, к каждой из которых применяются функции, указанные в SELECT (например, COUNT(), MIN() и так далее). Давайте разберём GROUP BY в SQL на конкретных примерах.
Допустим, у нас есть таблица супермаркетов:
- id — уникальный идентификатор.
- shop_id — уникальный идентификатор супермаркета.
- price — цена на молоко.
Нам необходимо узнать среднюю цену на молоко у каждого супермаркета. Обратите внимание, что shop_id может повторяться (ведь есть сети супермакетов). Поэтому нам необходимо сделать группу по shop_id, и для каждой строки в этой группе вычислить среднюю цену.
Исходная таблица выглядит следующим образом:
id | shop_id | price |
1 | 1 | 40 |
2 | 2 | 36 |
3 | 1 | 35 |
4 | 3 | 38 |
5 | 4 | 39 |
6 | 3 | 38 |
7 | 3 | 35 |
Для решения нашей задачи мы используем GROUP BY:
SELECT `shop_id`, AVG(`price`) FROM `table` GROUP BY `shop_id`
В результате получится следующее:
shop_id | AVG(`price`) |
1 | 37.5 |
2 | 36.0 |
3 | 37.0 |
4 | 39.0 |
Таким образом, мы узнали среднюю цену в конкретной сети супермаркетов (или в одиночном магазине).
Ещё одним очень частым применением GROUP BY в SQL является выборка уникальных записей из таблиц. В предыдущем примере Вы заметили, что в результирующей выборке нет повторяющихся shop_id, тогда как в исходной таблице они были.
Допустим, у нас есть таблица с пользователями:
- id — уникальный идентификатор.
- email — e-mail пользователя.
- hash — уникальный хэш пользователя.
И перед нами встала задача выбрать уникальных пользователей, причём именно уникальных людей, а не уникальных учётных записей. Ведь у одного человека может быть и 100 аккаунтов с разными e-mail и, разумеется, id. А hash — это некая строка, характеризующая его как уникального человека.
Таким образом, нам надо выбрать все записи с уникальным hash. Для этого опять же используется GROUP BY:
SELECT * FROM `table` GROUP BY `hash`
В результате, будут извлечены только уникальные hash, то есть 2 одинаковых hash в результирующей выборке Вы не увидите.
Вот таких два практических примера использования GROUP BY в SQL мы разобрали.
- Создано 09.09.2013 12:31:55
- Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
<a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>Она выглядит вот так:
-
Текстовая ссылка:
<a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
[URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]
в чем разница между GROUP BY и ORDER BY в sql
ЗАКАЗ: сортировка данных в порядке возрастания или убывания.
рассмотрим клиенты стол:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
ниже приведен пример, который будет сортировать результаты в порядке возрастания по имени:
SQL> SELECT * FROM CUSTOMERS
ORDER BY NAME;
это приведет к следующему результату:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
+----+----------+-----+-----------+----------+
ГРУППЫ: упорядочить идентичные данные в группы.
теперь клиенты таблица следующие записи с повторяющимися именами:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Ramesh | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | kaushik | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
если вы хотите сгруппировать идентичные имена в одно имя, то группа по запросу будет выглядеть следующим образом:
SQL> SELECT * FROM CUSTOMERS
GROUP BY NAME;
это приведет к следующему результату: (для идентичных имен он выберет последний и, наконец, отсортирует столбец в порядке возрастания)
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 4 | kaushik | 25 | Mumbai | 6500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
| 2 | Ramesh | 25 | Delhi | 1500.00 |
+----+----------+-----+-----------+----------+
как вы заключили,что он бесполезен без SQL-функций, таких как sum, avg и т. д..
так пройти через это определение поймите правильное использование GROUP BY:
предложение GROUP BY работает над строками, возвращаемыми запросом путем суммирования идентичные строки в одну / отдельную группу и возвращает одну строку с резюме для каждой группы, используя соответствующий агрегат функция в списке выбора, например COUNT (), SUM (), MIN (), MAX (), AVG(), так далее.
теперь, если вы хотите знать общую сумму зарплаты на каждого клиента( имя), то группа по запросу будет как следует:
SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
GROUP BY NAME;
это приведет к следующему результату: (сумма зарплат идентичных имен и сортировка столбца имени после удаления идентичных имен)
+---------+-------------+
| NAME | SUM(SALARY) |
+---------+-------------+
| Hardik | 8500.00 |
| kaushik | 8500.00 |
| Komal | 4500.00 |
| Muffy | 10000.00 |
| Ramesh | 3500.00 |
+---------+-------------+
Как эффективно его применять
Резюме : в этом руководстве вы узнаете, как использовать предложение SQL GROUP BY для группировки строк на основе одного или нескольких столбцов.
Введение в SQL GROUP BY условие
Группирование — это одна из самых важных задач, с которыми вам приходится сталкиваться при работе с базами данных. Чтобы сгруппировать строки в группы, используйте предложение GROUP BY.
Предложение GROUP BY является необязательным предложением оператора SELECT, который объединяет строки в группы на основе соответствующих значений в указанных столбцах.Одна строка возвращается для каждой группы.
Вы часто используете GROUP BY в сочетании с агрегатной функцией, такой как MIN, MAX, AVG, SUM или COUNT, чтобы вычислить показатель, который предоставляет информацию для каждой группы.
Ниже показан синтаксис предложения GROUP BY.
SELECT column1, column2, AGGREGATE_FUNCTION (столбец 3) ИЗ Таблица 1 ГРУППА ПО column1, column2;
Не обязательно включать статистическую функцию в предложение SELECT.Однако, если вы используете статистическую функцию, она вычислит итоговое значение для каждой группы.
Если вы хотите отфильтровать строки перед группировкой, добавьте предложение WHERE. Однако для фильтрации групп используется предложение HAVING.
Важно подчеркнуть, что предложение WHERE применяется до группировки строк, тогда как предложение HAVING применяется после группировки строк. Другими словами, предложение WHERE применяется к строкам, а предложение HAVING применяется к группам.
Чтобы отсортировать группы, вы добавляете предложение ORDER BY после предложения GROUP BY.
Столбцы, которые появляются в предложении GROUP BY, называются столбцами группировки . Если столбец группировки содержит значения NULL, все значения NULL объединяются в одну группу, поскольку предложение GROUP BY считает, что значения NULL равны.
Примеры SQL GROUP BY
Мы будем использовать таблицы сотрудников
и отделов
в примере базы данных, чтобы продемонстрировать, как работает предложение GROUP BY.
Чтобы найти численность персонала каждого отдела, вы группируете сотрудников по столбцу департамент_ид
и применяете функцию COUNT для каждой группы как следующий запрос:
SELECT department_id, COUNT (employee_id) численность персонала ИЗ сотрудников ГРУППА ПО department_id;
См. Это в действии
SQL GROUP BY с INNER JOIN пример
Чтобы получить название отдела, вы объединяете таблицу сотрудников
с таблицей отделов
следующим образом:
ВЫБРАТЬ е.department_id, название отдела, COUNT (employee_id) численность персонала ИЗ сотрудники е ВНУТРЕННИЕ СОЕДИНЕНИЯ отделов d ON d.department_id = e.department_id ГРУППА ПО e.department_id;
См. Это в действии
SQL GROUP BY с примером ORDER BY
Чтобы отсортировать отделы по численности персонала, добавьте предложение ORDER BY в виде следующего оператора:
SELECT e.department_id, название отдела, COUNT (employee_id) численность персонала ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id ЗАКАЗАТЬ по численности персонала DESC;
См. Это в действии
Обратите внимание, что в предложении ORDER BY можно использовать либо псевдоним численности персонала
, либо COUNT (employee_id)
.
SQL GROUP BY с HAVING пример
Чтобы найти отдел с численностью персонала более 5, вы используете предложение HAVING в качестве следующего запроса:
SELECT e.department_id, название отдела, COUNT (employee_id) численность персонала ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id Иметь численность персонала> 5 ЗАКАЗАТЬ по численности персонала DESC;
См. Это в действии
SQL GROUP BY с примером MIN, MAX и AVG
Следующий запрос возвращает минимальную, максимальную и среднюю зарплату сотрудников в каждом отделе.
SELECT e.department_id, название отдела, MIN (зарплата) min_salary, MAX (зарплата) max_salary, КРУГЛЫЙ (AVG (зарплата), 2) средняя_ зарплата ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id;
См. Это в действии
SQL GROUP BY с примером функции SUM
Чтобы получить общую зарплату по отделу, вы применяете функцию SUM к столбцу оклад
и группируете сотрудников по столбцу Department_id
как следует:
ВЫБРАТЬ e.department_id, название отдела, SUM (зарплата) total_salary ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id;
См. Это в действии
SQL GROUP BY по нескольким столбцам
До сих пор вы видели, что мы сгруппировали всех сотрудников по одному столбцу. Например, следующий пункт
GROUP BY отдела_ид
помещает все строки с одинаковыми значениями в столбце отдел_ид
в одну группу.
Как насчет группировки сотрудников по значениям в столбцах Department_id
и job_id
?
GROUP BY отдела_идента, job_id
В этом пункте все сотрудники с одинаковыми значениями будут объединены в столбцы отдела_ид
и job_id
в одну группу.
Следующий оператор группирует строки с одинаковыми значениями в столбцах Department_id
и job_id
в одной группе, а затем возвращает строки для каждой из этих групп.
SELECT e.department_id, название отдела, e.job_id, название работы, COUNT (employee_id) ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.department_id = e.department_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ вакансии j ON j.job_id = e.job_id GROUP BY e.department_id, e.job_id;
См. Это в действии
Отделение 2, 3 и 5 кажется более чем одним.
Это потому, что в этих отделах есть сотрудники, которые занимают разные должности. Например, в отделе отгрузки есть 2 сотрудника, выполняющих работу клерка доставки, 1 сотрудник, выполняющий работу клерка склада, и 4 сотрудника, выполняющие работу менеджера склада.
SQL GROUP BY и DISTINCT
Если вы используете предложение GROUP BY
без агрегатной функции, предложение GROUP BY
ведет себя как оператор DISTINCT.
Ниже приведены номера телефонов сотрудников, а также сгруппированы строки по номерам телефонов.
SELECT телефонный номер ИЗ сотрудников ГРУППА ПО телефонный номер;
См. Это в действии
Обратите внимание, что телефонные номера отсортированы.
Следующий оператор также извлекает телефонные номера, но вместо использования предложения GROUP BY
он использует оператор DISTINCT
.
ВЫБЕРИТЕ DISTINCT телефонный номер ИЗ сотрудники;
См. Это в действии
Набор результатов тот же, за исключением того, что набор, возвращенный оператором DISTINCT
, не отсортирован.
В этом руководстве мы показали, как использовать предложение GROUP BY
для суммирования строк в группы и применения функции агрегирования к каждой группе.
- Был ли этот урок полезным?
- Да Нет
SQL GROUP BY, COUNT — с примерами
Какова цель предложения GROUP BY?
- Предложение GROUP BY группирует записи в итоговые строки.
- GROUP BY возвращает одну запись для каждой группы.
- запросов GROUP BY часто включают агрегаты: COUNT, MAX, SUM, AVG и т. Д.
- GROUP BY может группировать по одному или нескольким столбцам.
Синтаксис SQL GROUP BY
Общий синтаксис
ВЫБЕРИТЕ имена столбцов ОТ таблицы ГДЕ состояние GROUP BY имена столбцов
Общий синтаксис с ORDER BY:
ВЫБЕРИТЕ имена столбцов ОТ таблицы ГДЕ состояние GROUP BY имена столбцов ЗАКАЗАТЬ ПО ИМЯ столбца
ЗАКАЗЧИК |
---|
Id |
Имя |
Фамилия |
Город |
Страна |
Телефон |
SQL GROUP BY Примеры
Проблема: Укажите количество клиентов в каждой стране.
ВЫБЕРИТЕ СЧЕТ (Id), Страна ОТ клиента ГРУППА ПО СТРАНЕ
Результат: 21 запись.
Количество | Страна |
---|---|
3 | Аргентина |
2 | Австрия |
2 | Бельгия |
9 | Бразилия |
3 | Канада |
ЗАКАЗЧИК |
---|
Id |
Имя |
Фамилия |
Город |
Страна |
Телефон |
Задача: Указать количество клиентов
в каждой стране отсортировано по убыванию
ВЫБЕРИТЕ СЧЕТ (Id), Страна ОТ клиента ГРУППА ПО СТРАНЕ ЗАКАЗАТЬ ПО СЧЕТУ (Id) DESC
Результат: 21 запись.
Количество | Страна |
---|---|
13 | США |
11 | Франция |
11 | Германия |
9 | Бразилия |
7 | Великобритания |
ЗАКАЗЧИК |
---|
Id |
Имя |
Фамилия |
Город |
Страна |
Телефон |
ЗАКАЗАТЬ |
---|
Id |
ЗаказатьДата |
Заказать № |
CustomerId |
Общая сумма |
Задача: Перечислите общую сумму заказанных
для каждого клиента
ВЫБЕРИТЕ СУММУ (O.TotalAmount) AS SUM, C.FirstName, C.LastName ОТ [Заказ] O ПРИСОЕДИНЯЙТЕСЬ К Клиенту C ON O.CustomerId = C.Id GROUP BY C.FirstName, C.LastName ЗАКАЗАТЬ ПО СУММЕ (O.TotalPrice) DESC
Этот запрос объединяет заказ с клиентом для получения имен клиентов
Результат: 89 записей.
Сумма | Имя | Фамилия |
---|---|---|
117483.39 | Хорст | Клосс |
115673,39 | Хосе | Паваротти |
113236,68 | Роланд | Мендель |
57317,39 | Патриция | МакКенна |
52245.90 | Паула | Уилсон |
34101.15 | Марио | Pontes |
32555,55 | Мария | Ларссон |
SQL Server GROUP BY
Резюме : в этом руководстве вы узнаете, как использовать предложение SQL Server GROUP BY
для упорядочения строк в группах по одному или нескольким столбцам.
Введение в SQL Server Предложение GROUP BY
Предложение GROUP BY позволяет упорядочить строки запроса в группы. Группы определяются столбцами, указанными в предложении
GROUP BY
.
Ниже показан синтаксис предложения GROUP BY
:
SELECT список_выборки ИЗ table_name ГРУППА ПО column_name1, имя_ столбца2...;
В этом запросе предложение GROUP BY
создало группу для каждой комбинации значений в столбцах, перечисленных в предложении GROUP BY
.
Рассмотрим следующий пример:
SELECT Пользовательский ИД, YEAR (order_date) order_year ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) СОРТИРОВАТЬ ПО Пользовательский ИД;
В этом примере мы получили идентификатор клиента и заказанный год клиентов с идентификатором клиента один и два.
Как ясно видно из результатов, клиент с идентификатором 1 разместил один заказ в 2016 году и два заказа в 2018. Клиент с идентификатором два разместил два заказа в 2017 году и один заказ в 2018.
Давайте добавим Предложение GROUP BY
для запроса, чтобы увидеть эффект:
SELECT Пользовательский ИД, YEAR (order_date) order_year ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) ГРУППА ПО Пользовательский ИД, ГОД (дата заказа) СОРТИРОВАТЬ ПО Пользовательский ИД;
Предложение GROUP BY
организовало первые три строки в две группы, а следующие три строки - в две другие группы с уникальными комбинациями идентификатора клиента и года заказа.
С функциональной точки зрения предложение GROUP BY
в приведенном выше запросе дало тот же результат, что и следующий запрос, использующий предложение DISTINCT
:
SELECT DISTINCT Пользовательский ИД, YEAR (order_date) order_year ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) СОРТИРОВАТЬ ПО Пользовательский ИД;
SQL Server Предложение GROUP BY
и агрегатные функции
На практике предложение GROUP BY
часто используется с агрегатными функциями для генерации сводных отчетов.
Агрегатная функция выполняет вычисление для группы и возвращает уникальное значение для каждой группы. Например, COUNT ()
возвращает количество строк в каждой группе. Другими обычно используемыми агрегатными функциями являются SUM ()
, AVG ()
(в среднем), MIN ()
(минимум), MAX ()
(максимум).
Предложение GROUP BY
организует строки в группы, а функция агрегирования возвращает сводку (количество, минимум, максимум, среднее, сумма и т. Д.) Для каждой группы.
Например, следующий запрос возвращает количество заказов, сделанных клиентом по годам:
SELECT Пользовательский ИД, YEAR (order_date) order_year, COUNT (order_id) order_placed ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) ГРУППА ПО Пользовательский ИД, ГОД (дата заказа) СОРТИРОВАТЬ ПО Пользовательский ИД;
Если вы хотите сослаться на любой столбец или выражение, которое не указано в предложении GROUP BY
, вы должны использовать этот столбец в качестве входных данных для статистической функции.В противном случае вы получите ошибку, потому что нет гарантии, что столбец или выражение будет возвращать одно значение на группу. Например, следующий запрос не будет выполнен:
SELECT Пользовательский ИД, YEAR (order_date) order_year, статус заказа ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) ГРУППА ПО Пользовательский ИД, ГОД (дата заказа) СОРТИРОВАТЬ ПО Пользовательский ИД;
Подробнее Примеры предложений GROUP BY
Давайте рассмотрим еще несколько примеров, чтобы понять, как работает предложение GROUP BY
.
Использование предложения GROUP BY
с примером функции COUNT ()
Следующий запрос возвращает количество клиентов в каждом городе:
SELECT Город, COUNT (customer_id) customer_count ИЗ sales.customers ГРУППА ПО город СОРТИРОВАТЬ ПО город;
В этом примере предложение GROUP BY
группирует клиентов по городам, а функция COUNT ()
возвращает количество клиентов в каждом городе.
Аналогично, следующий запрос возвращает количество клиентов по штатам и городам.
SELECT Город, штат, COUNT (customer_id) customer_count ИЗ sales.customers ГРУППА ПО штат, город СОРТИРОВАТЬ ПО Город, штат;
Использование предложения GROUP BY
с функциями MIN
и MAX
, пример
Следующий оператор возвращает минимальные и максимальные прейскурантные цены всех продуктов с моделью 2018 по бренду:
SELECT имя бренда, MIN (list_price) min_price, MAX (list_price) max_price ИЗ производство.продукты р ВНУТРЕННЕЕ РЕШЕНИЕ production.brands b ON b.brand_id = p.brand_id ГДЕ model_year = 2018 ГРУППА ПО имя бренда СОРТИРОВАТЬ ПО имя бренда;
В этом примере предложение WHERE
обрабатывается перед предложением GROUP BY
, как всегда.
Использование предложения GROUP BY
с примером функции AVG ()
В следующем утверждении функция AVG ()
используется для возврата средней прейскурантной цены по бренду для всех продуктов с модельным годом 2018:
ВЫБРАТЬ имя бренда, AVG (list_price) avg_price ИЗ производство.продукты р ВНУТРЕННЕЕ РЕШЕНИЕ production.brands b ON b.brand_id = p.brand_id ГДЕ model_year = 2018 ГРУППА ПО имя бренда СОРТИРОВАТЬ ПО имя бренда;
Использование предложения GROUP BY
с примером функции SUM
См. Следующую таблицу order_items
:
В следующем запросе используется функция SUM ()
для получения чистого значения каждого заказ:
ВЫБРАТЬ номер заказа, СУММА ( количество * list_price * (1 - скидка) ) чистая стоимость ИЗ продажи.order_items ГРУППА ПО номер заказа;
В этом руководстве вы узнали, как использовать предложение SQL Server GROUP BY
для упорядочения строк в группах по указанному списку столбцов.
SQL GROUP BY
ϼƺ (СУММА) Ҫ ГРУППА ПО 䡣
ГРУППА BY
GROUP BY BY Ϻϼƺһж Խ з 顣
SQL GROUP BY �
ВЫБЕРИТЕ имя столбца, агрегатная функция (имя столбца) FROM table_name ГДЕ значение оператора column_name GROUP BY column_name
SQL GROUP BY ʵ
ӵ "Заказы"
O_Id | OrderDate | ЗаказЦена | Заказчик |
---|---|---|---|
1 | 2008/12/29 | 1000 | куста |
2 | 2008/11/23 | 1600 | Картер |
3 | 2008/10/05 | 700 | куста |
4 | 2008/09/28 | 300 | куста |
5 | 2008/08/06 | 2000 | Адамс |
6 | 2008/07/21 | 100 | Картер |
ܽܶ ϣÿͻ ܽܶ
Ҫʹ GROUP BY Կ ͻϡ
ʹ SQL 䣺
ВЫБЕРИТЕ клиента, СУММУ (OrderPrice) ОТ заказов GROUP BY Клиент
Заказчик | сум (OrderPrice) |
---|---|
куста | 2000 |
Картер | 1700 |
Адамс | 2000 |
ԣ Բ ԣ
ǿһʡ GROUP BY 9ô
ВЫБЕРИТЕ клиента, СУММУ (OrderPrice) ОТ заказов
Заказчик | сум (OrderPrice) |
---|---|
куста | 5700 |
Картер | 5700 |
куста | 5700 |
куста | 5700 |
Адамс | 5700 |
Картер | 5700 |
ĽҪġ
ВЫБРАТЬ أ £ ВЫБРАТЬ ָ Сумма клиента (OrderPrice) СУММА (OrderPrice) "ֵ Order" OrderPrice "е ܼ ƣ" Клиент "6 Ӧ ÿ ֵ Ӧ" Заказы "eÿһUˣǵòȷĽѾˣGROUP BY ⡣
GROUP BY һϵ
һϵӦ Զ һϵӦ GROUP BY 䣬
ВЫБЕРИТЕ клиента, OrderDate, SUM (OrderPrice) из заказов GROUP BY Клиент, OrderDate,