Запросы могут производить обобщенное групповое значение полей точно также как и значение одного поля. Это делает с помощью агрегатных функций. Агрегатные функции производят одиночное значение для всей группы таблицы. Имеется список этих функций:
- COUNT производит номера строк или не-NULL значения полей которые выбрал запрос.
- SUM производит арифметическую сумму всех выбранных значений данного поля.
- AVG производит усреднение всех выбранных значений данного поля.
- MAX производит наибольшее из всех выбранных значений данного поля.
- MIN производит наименьшее из всех выбранных значений данного поля.
Давайте разберем как использовать агрегатные функции.
Агрегатные функции используются подобно именам полей в предложении SELECT запроса, но с одним исключением, они берут имена поля как аргументы.
Только числовые поля могут использоваться с SUM и AVG. С COUNT, MAX, и MIN, могут использоваться и числовые или символьные поля.
Когда они используются с символьными полями, MAX и MIN будут транслировать их в эквивалент ASCII, который должен сообщать, что MIN будет означать первое, а MAX последнее значение в алфавитном порядке.
Чтобы найти SUM всех наших покупок в таблицы "Порядков", мы можем ввести следующий запрос:
SELECT SUM ((amt))
FROM TABLE_1;
Это конечно, отличается от выбора поля, при котором возвращается одиночное значение, независимо от того, сколько строк находится в таблице. Из-за этого, агрегатные функции и поля не могут выбираться одновременно, пока предложение GROUP BY (описанное далее) не будет использовано. Нахождение усредненной суммы — это похожая операция:
SELECT AVG (amt)
FROM TABLE_1;
Давайте приступим к изучению атрибута count
COUNT
Функция COUNT несколько отличается от всех. Она считает число значений в данном столбце, или число строк в таблице. Когда она считает значения столбца, она используется с DISTINCT, чтобы производить счет чисел различных значений в данном поле. Хочу сделать акцент, что если мы хотим посчитать именно число различных значений, то используем DISTINCT. Мы могли бы использовать ее, чтобы сосчитать номера например продавцов в нашей таблице:
SELECT COUNT ( DISTINCT number )
FROM TABLE_1;
Обратите внимание в вышеупомянутом примере, что DISTINCT, сопровождаемый именем поля с которым он применяется, помещен в круглые скобки, но не сразу после SELECT, как раньше. Этого использования DISTINCT с COUNT применяемого к индивидуальным столбцам.
DISTINCT может использоваться таким образом, с любой функцией агрегата, но наиболее часто он используется с COUNT. С MAX и MIN, это просто не будет иметь никакого эффекта, а SUM и AVG, вы обычно применяете для включения повторяемых значений, так как они законно эффективнее общих и средних значений всех столбцов.
Использование COUNT со строками
Чтобы подсчитать общее число строк в таблице, используйте функцию COUNT со звездочкой вместо имени поля, как например в следующем примере
SELECT COUNT (*)
FROM TABLE_1
COUNT со звездочкой включает и NULL и дубликаты, по этой причине DISTINCT не может быть использован. DISTINCT может производить более высокие номера, чем COUNT особого поля, который удаляет все строки, имеющие избыточные или NULL данные в этом поле. DISTINCT неприменим c COUNT (*), потому, что он не имеет никакого действия в хорошо разработанной и поддерживаемой базе данных. В такой базе данных, не должно быть ни таких строк, которые бы являлись полностью пустыми, ни дубликатов.
Если все таки имеются полностью пустые или избыточные строки, вы вероятно не захотите чтобы COUNT скрыл от вас эту информацию.
Включение дубликатов в агрегатные функции
Агрегатные функции могут также использовать аргумент ALL, который помещается перед именем поля, подобно DISTINCT, но означает противоположное: — включать дубликаты. ANSI технически не позволяет этого для COUNT, но многие реализации ослабляют это ограничение.
Различия между ALL и * когда они используются с COUNT:
- ALL использует имя поля как аргумент.
- ALL не может подсчитать значения NULL.
Пока * является единственным аргументом который включает NULL значения, и он используется только с COUNT; функции отличные от COUNT игнорируют значения NULL в любом случае. Следующая команда подсчитает (COUNT) число не-NULL значений в поле rating в таблице (включая повторения):
SELECT COUNT ( ALL rating )
FROM TABLE_1;
Агрегаты построенные на скалярном выражении
До этого, вы использовали агрегатные функции с одиночными полями как аргументами. Вы можете также использовать агрегатные функции с аргументами, которые состоят из скалярных выражений, включающих одно или более полей:
SELECT MAX ( blnc + (amt) )
FROM TABLE_1;
Для каждой строки таблицы, этот запрос будет складывать blnc и amt для и выбирать самое большое значение которое он найдет.
Предложение GROUP BY
Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству.
Если проще, то GROUP BY группирует значение поля в разрезе других полей. Это дает вам возможность объединять поля и агрегатные функции в едином предложении SELECT. Например, предположим что вы хотите найти наибольшую сумму полученную каждым продавцом:
SELECT number, MAX (amt)
FROM TABLE_1
GROUP BY number;
SELECT number, date, MAX ((amt))
FROM TABLE_1
GROUP BY number, date;
Предложение HAVING
Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальную сумму, значение которой выше $3000.00. Вы не сможете использовать агрегатную функцию в предложении WHERE, потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает что вы не сможете сделать что-нибудь подобно следующему:
SELECT number, date, MAX (amt)
FROM TABLE_1
WHERE MAX ((amt)) > 3000.00
GROUP BY number, date;
Чтобы увидеть максимальную стоимость свыше $3000.00, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая:
SELECT number, date, MAX ((amt))
FROM TABLE_1
GROUP BY number, date
HAVING MAX ((amt)) > 3000.00;
Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящей из команд использующих GROUP BY. Они должны иметь одно значение на группу вывода. Следующая команда будет запрещена:
SELECT number, MAX (amt)
FROM TABLE_1
GROUP BY number
HAVING date = 10/03/1988;
Поле date не может быть вызвано предложением HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля выбранные GROUP BY. Вот правильный способ сделать вышеупомянутый запрос:
SELECT number, MAX (amt)
FROM TABLE_1
WHERE date = 10/03/1990
GROUP BY number;
Подведём итог
Мы познакомились с агрегатными функциями и теперь мы можем быстро посчитать сумму, количество, максимальное, или минимальное значение, как во всей таблице так и в группе, с помощью предложения GROUP BY. Так же мы научились делать выборку в группах используя предложение HAVING
Если статья была Вам полезна, ставьте пальцы вверх и подписывайтесь. Оставляйте свои пожелания и вопросы в комментариях, с удовольствием отвечу.
#it #sql #обучение #курс