Команда union
Содержание:
Что такое оператор GROUP BY
GROUP BY – это оператор (или конструкция, кому как удобней) SQL для группировки данных по полю, при использовании в запросе агрегатных функций, таких как sum, max, min, count и других.
Как Вы знаете, агрегатные функции работают с набором значений, например sum суммирует все значения. А вот допустим, Вам необходимо просуммировать по какому-то условию или сразу по нескольким условиям, именно для этого нам нужен оператор group by, чтобы сгруппировать все данные по полям с выводом результатов агрегатных функций.
Как мне кажется, наглядней будет это все разобрать на примерах, поэтому давайте перейдем к примерам.
The GROUP BY clause: MySQL vs. standard SQL
Standard SQL does not allow you to use an alias in the clause, however, MySQL supports this.
For example, the following query extracts the year from the order date. It first uses as an alias of the expression and then uses the alias in the clause. This query is not valid in standard SQL.
MySQL also allows you to sort the groups in ascending or descending orders while the standard SQL does not. The default order is ascending. For example, if you want to get the number of orders by status and sort the status in descending order, you can use the clause with as the following query:
Notice that we used in the clause to sort the in descending order. We could also specify explicitly in the clause to sort the groups by status in ascending order.
In this tutorial, we have shown you how to use the MySQL clause to group rows into subgroups based on values of columns or expressions.
- Was this tutorial helpful?
Пример — использование SQL GROUP BY
В некоторых случаях вам потребуется использовать предложение SQL GROUP BY с функцией AVG. Например, вы также можете использовать функцию AVG, чтобы вернуть название отдела и средние продажи (в связанном отделе).
PgSQL
SELECT department,
AVG(sales) AS «Average Sales»
FROM order_details
WHERE department > 10
GROUP BY department;
1 2 3 4 5 |
SELECTdepartment, AVG(sales)AS»Average Sales» FROMorder_details WHEREdepartment>10 GROUP BYdepartment; |
Поскольку в операторе SELECT вы указали один столбец, который не инкапсулирован в функции AVG, вы должны использовать предложение GROUP BY, поэтому поле department должно быть указано в разделе GROUP BY.
Раздел GROUP BY
Если в табличном выражении присутствует раздел GROUP BY SQL, то следующим выполняется GROUP BY.
Если обозначить через R таблицу, являющуюся результатом предыдущего раздела (FROM или WHERE), то результатом раздела GROUP BY является разбиение R на множество групп строк, состоящего из минимального числа групп таких, что для каждого столбца из списка столбцов раздела GROUP BY во всех строках каждой группы, включающей более одной строки, значения этого столбца равны. Для обозначения результата раздела GROUP BY в стандарте используется термин “сгруппированная таблица”.
Если утверждение SELECT содержит предложение GROUP BY(SELECT GROUP BY), список выбора может содержать только следующие типы выражений:
- Константы.
- Агрегатные функции.
- Функции USER, UID, и SYSDATE.
- Выражения, соответствующие перечисленным в предложении GROUP BY.
- Выражения, включающие вышеперечисленные выражения.
Пример 1. Вычислить общий объем покупок для каждого товара:
Фраза GROUP BY не предполагает упорядочивания строк. Для упорядочивания результата этого примера по кодам товаров, следует поместить фразу ORDER BY stock следом за фразой GROUP BY.
Пример 2. Можно использовать группировки данных GROUP BY совместно с условием. Например, выбрать для каждого покупаемого товара его код и общий объем покупок, за исключением покупок покупателя с кодом 23:
Строки, не удовлетворяющие условию WHERE, исключаются перед группированием данных.
Строки таблицы можно группировать по любой комбинации ее полей. Если поле, по значениям которого осуществляется группирование, содержит какие-либо неопределенные значения, то каждое из них порождает отдельную группу.
Допустим, есть задача на вычисление количества какого-либо продукта. Поставщик поставляет нам продукцию по определённой цене. Вычислим общее количество каждого из продуктов. В этом нам поможет фраза GROUP BY. Результатом задачи станет таблица, состоящая из нескольких колонок. Поставки будут группироваться по ПР. Компоновка происходит по группам, которую и инициирует Group By SQL. Необходимо отметить, что данная фраза предполагает применение фразы Select, она же в свою очередь определяет единственное значение для каждого выражения сформированной группы. Бывают три случая для конкретного выражения: оно принимает арифметическое значение, оно становится SQL-функцией, которая будет сводить все значения столбца к сумме или другому заданному значению, также выражение может стать константой. Строки таблицы не обязательно должны быть строго сгруппированы, они могут группироваться по любой комбинации столбцов таблицы. Необходимо учитывать, что упорядочивание запросы по ПР возможно в том случае, если будет сделан соответствующий запрос.
Синтаксис
Синтаксис для функции AVG в SQL.
SELECT AVG(aggregate_expression) FROM tables ;
Или синтаксис для функции AVG при группировке результатов по одному или нескольким столбцам.
SELECT expression1, expression2, … expression_n, AVG(aggregate_expression) FROM tables GROUP BY expression1, expression2, … expression_n;
Параметры или аргумент
- expression1, expression2, … expression_n
- Выражения, которые не инкапсулированы в функции AVG и должны быть включены в предложение GROUP BY в конце SQL запроса
- aggregate_expression
- Это столбец или выражение, которое будет усреднено
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
- WHERE conditions
- Необязательный. Это условия, которые должны быть выполнены для выбора записей
Пример — две таблицы в операторе FROM (INNER JOIN)
Давайте посмотрим, как использовать предложение FROM, чтобы INNER JOIN (объединить) вместе две таблицы.
В этом примере у нас есть таблица 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 |
И таблица categories со следующими данными:
category_id | category_name |
---|---|
25 | Deli |
50 | Produce |
75 | Bakery |
100 | General Merchandise |
125 | Technology |
Выполните следующий SQL-оператор:
PgSQL
SELECT products.product_name, categories.category_name
FROM products
INNER JOIN categories
ON products.category_id = categories.category_id
WHERE product_name <> ‘Pear’;
1 2 3 4 5 |
SELECTproducts.product_name,categories.category_name FROMproducts INNER JOINcategories ONproducts.category_id=categories.category_id WHEREproduct_name<>’Pear’; |
Будет выбрано 5 записей. Вот результаты, которые вы должны получить:
product_name | category_name |
---|---|
Banana | Produce |
Orange | Produce |
Apple | Produce |
Bread | Bakery |
Sliced Ham | Deli |
В этом примере оператора FROM используется объединение двух таблиц — products и categories. В этом случае мы используем FROM, чтобы указать INNER JOIN между таблицами products и categories на основе столбца category_id в обеих таблицах.
Использование конструкции GROUP BY с операцией HAVING
Операция позволяет ограничивать или исключать результаты операции , т.е., по сути, накладывать на результирующий набор условие . В следующем примере операция ограничивает результаты запроса только теми отделами, в которых максимальная зарплата превышает 20 000:
SQL> SELECT department_id, max(salary) 2 FROM employees 3 GROUP BY department_id 4* HAVING MAX(salary)>20000; DEPARTMENT_ID MAX(SALARY) ------------- ----------- 90 24000 SQL>
Вас заинтересует / Intresting for you:
Oracle и Java: использование P… 2875 просмотров sepia Tue, 08 May 2018, 08:52:34
Значения NULL в PL/SQL Oracle 2510 просмотров Дэн Wed, 01 Jul 2020, 08:10:56
Язык SQL и PL/SQL Oracle 2039 просмотров Андрей Волков Tue, 21 Nov 2017, 13:17:28
Oracle IDE: JDeveloper, SQL De… 2664 просмотров Ольга Потемкина Tue, 21 Nov 2017, 13:18:46
Author: Aida
Другие статьи автора:
Заключение
Для более глубокого изучения ORM и GROUP BY, просмотрите следующие ссылки:
- How to use grouping sets in Django: Статья о продвинутой группировке по таким техникам, как группировка по cube, группировка по rollup и группировка по grouping sets.
- How to Get the First or Last Value in a Group Using Group By in SQL: Небольшая хитрость с использованием массивов в PostgreSQL.
- 12 Common Mistakes and Missed Optimization Opportunities in SQL: 12 распространенных ошибок и упущенных возможностей оптимизации в SQL.
- : Документация по общим запросам аггрегации.
Оригинальная статья: Understand Group by in Django with SQL
Spread the love
Подведем итоги
Конструкция/Блок | Порядок выполнения | Выполняемая функция |
---|---|---|
SELECT возвращаемые выражения | 4 | Возврат данных полученных запросом |
FROM источник | В нашем случае это пока все строки таблицы | |
WHERE условие выборки из источника | 1 | Отбираются только строки, проходящие по условию |
GROUP BY выражения группировки | 2 | Создание групп по указанному выражению группировки. Расчет агрегированных значений по этим группам, используемых в SELECT либо HAVING блоках |
HAVING фильтр по сгруппированным данным | 3 | Фильтрация, накладываемая на сгруппированные данные |
ORDER BY выражение сортировки результата | 5 | Сортировка данных по указанному выражению |
SalaryAmount |
---|
5000 |
SalaryAmount |
---|
2000 |
2500 |
5000 |