Что такое агрегатная функция sql
В статье об группировках мы обсудили, что при использовании оператора GROUP BY мы можем использовать агрегатные функции. Давайте поговорим о них поглубже .
Агрегатная функция – это функция, которая выполняет вычисление на наборе значений и возвращает одиночное значение.
MySQLSELECT [литералы, агрегатные_функции, поля_группировки] FROM имя_таблицы GROUP BY поля_группировки;Например, запрос с использованием агрегатной функции AVG может выглядеть так:
MySQLSELECT home_type, AVG(price) as avg_price FROM Rooms GROUP BY home_type
home_type avg_price Private room 89.4286 Entire home/apt 148.6667 Shared room 40 Агрегатная функция от агрегатной функции стр. 1
Найти максимальное значение среди средних цен ПК, посчитанных для каждого производителя отдельно.
Посчитать средние значения стоимости по производителям труда не составляет:
Консоль
![]()
Выполнить
Однако стандарт запрещает использовать подзапрос в качестве аргумента агрегатной функции, т.е. нельзя решить задачу следующим способом:
Консоль
![]()
Выполнить
В подобных случаях используется подзапрос в предложении FROM:
Консоль
![]()
Выполнить
С помощью новых возможностей языка – оконных функций - эту задачу можно решить без подзапроса:
Консоль
![]()
Выполнить
Обратите внимание, что оконные функции допускают использование агрегатной функции в качестве аргумента. Ключевое слово DISTINCT необходимо здесь, поскольку максимальное значение, подсчитанное по всему набору средних значений, будет «приписано» каждому производителю.
Стандарт также запрещает использовать агрегатную функцию как аргумент другой агрегатной функции. Т.е. мы не можем решить нашу задачу следующим образом:
Но не бывает правил без исключений. Как ни странно, но в Oracle подобные конструкции работают, и вышеприведенный запрос даст результат:
Чтобы убедиться в этом, зайдите на страницу задач обучающего этапа на сайте sql-ex.ru, выберите Oracle в списке СУБД и выполните запрос с флажком "Без проверки".
Кстати говоря, решение с использованием оконной функции также будет работать в Oracle. Могу предположить, что решение без оконной функции фактически её и использует, неявно подразумевая предложение OVER().
Страницы: 1 2 3 Агрегатные функции
SQL позволяет работать не только с отдельными строками, но и производить аналитику по всем строкам или по группе строк. Функции, возвращающие единственное значение для набора строк, называются агрегатными.
В большинстве задач можно обойтись следующим джентельменским набором агрегатных функций:
- avg(выражение) - арифметическое среднее;
- min(выражение) - минимальное значение выражения;
- max(выражение) - маскимальное значение выражения;
- sum(выражение) - сумма значений выражения;
- count(*) - количество строк в результате запроса;
- count(выражение) - количество значений выражения, не равных NULL .
Если в SQL запросе не используется GROUP BY , то значение агрегатной функции вычисляется по всем строкам, полученным в результате выполнения инструкций FROM и WHERE .
Чтобы вызвать агрегатную функцию необходимо указать ее в списке выборки (после SELECT ). Если в SELECT использована хотя бы одна агрегатная функция, то значениями других столбцов могут быть только вызовы агрегатных функций, либо константы. Попробуем воспользоваться агрегатными функциями на следующей таблице:
SELECT * FROM table1
value 1 2 3 NULL SELECT avg(value), min(value), max(value), sum(value), count(*) as count_total, count(value) as count_value FROM table1
avg min max sum count_total count_value 2 1 3 6 4 3 При попытке вызова агрегатной функции вместе с выводом столбца таблицы в списке выборки возникнет ошибка:
SELECT product_id, max(count) FROM purchase_itemcolumn "purchase_item.product_id" must appear in the GROUP BY clause or be used in an aggregate functionИ это логично. Агрегатная функция должна вернуть одно значение на весь набор данных (в нашем запросе одну строку), а какое значение product_id взять из всех строк? Помимо агрегатных функций есть еще аналитические функции, которые не изменяют количество строк в результате выборки, но при этом позволяют вычислять значения по набору строк. С ними мы познакомимся позднее.
Что такое агрегатная функция sql
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
"Программистами не рождаются" © 2023 JavaRush
Скачивайте наши приложения
"Программистами не рождаются" © 2023 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
Предыдущая запись

Консоль
