Агрегирующие функции используются для получения обобщающих значений. Их можно применять ко всем строкам таблицы, строкам, определенным в предложении WHERE или к группам строк в предложении GROUP BY. В любом случае, независимо от структуры набора строк, для каждого из них получается единственное значение.
Для выполнения агрегирующих операций используются следующие функции:
COUNT определяет количество строк или значений поля, выбранных посредством запроса и не являющихся NULL-значениями;
SUM вычисляет сумму всех выбранных значений данного поля;
AVG вычисляет среднее значение для всех выбранных значений данного поля;
МАХ вычисляет наибольшее из всех выбранных значений данного поля;
MIN вычисляет наименьшее из всех выбранных значений данного поля.
В качестве аргументов агрегирующих функций в большинстве случаев используются названия полей таблицы, но также допускаются константы, функции и любые их комбинации с арифметическими операторами.
Общая форма агрегирующей функции имеет следующий вид:
aggregate_function (<expr>)
Пример:
Найти средную стоимсть услуг:
SQL:
SELECT AVG(price) FROM tbl_service
С помощью следующего оператора можно найти среднюю стоимость всех услуг в случае удвоения их цены:
SQL:
SELECT AVG(price*2) FROM tbl_service
Подчиненный запрос состоит из инструкции SQL SELECT, находящейся внутри другого запроса на выборку или запроса на изменение. Эти инструкции вводятся в строку «Поле» бланка запроса для определения нового поля или в строку «Условие отбора» для определения условия отбора поля. Подчиненные запросы используются для выполнения следующих действий:
• проверка в
подчиненном запросе существования некоторых результатов
с помощью зарезервированных слов EXISTS или NOT EXISTS;
Предикат exists имеет следующий синтаксис:
< exists predicate> ::= EXISTS <subquery>
Значением этого предиката всегда является true или false, и это значение равно true тогда и только тогда, когда результат вычисления подзапроса не пуст.
• поиск в главном
запросе любых значений, которые равны, больше или
меньше значений, возвращаемых
в подчиненном запросе (с помощью за
резервированных слов ANY, IN или ALL);
Оператор ANY берет все значения выведенные подзапросом, ( для этого случая - это все значения city в таблице Заказчиков ), и оценивает их как верные если любой(ANY) из их равняется значению города текущей строки внешнего запроса.
=============== SQL Execution Log ============
| SELECT * |
| FROM Salespeople |
| WHERE city = ANY |
| (SELECT city |
| FROM Customers); |
| ============================================= |
| cnum cname city comm |
| ----- -------- ---- -------- |
| 1001 Peel London 0.12 |
| 1002 Serres San Jose 0.13 |
| 1004 Motika London 0.11 |
=============================================
Использование оператора ANY
Оператор ALL считает условие верным, если каждое значение, выбранное подзапросом, удовлетворяет условию внешнего запроса. Выберем тех заказчиков, чьи рейтинги выше чем у каждого заказчика в Москве:
SELECT *
FROM Customers
WHERE rating > ALL(
SELECT rating
FROM Customers
WHERE city = 'Москва'
)
Мы можем также использовать оператор IN чтобы создать запрос аналогичный предыдущему :
SELECT *
FROM Salespeople
WHERE city IN
( SELECT city
FROM Customers );
.
| cnum cname city comm |
| ----- -------- ---- -------- |
| 1001 Peel London 0.12 |
| 1002 Serres San Jose 0.13 |
| 1004 Motika London 0.11 |
Однако, оператор ANY может использовать другие реляционные опера- торы кроме равняется ( = ), и таким образом делать сравнения которые являются выше возможностей IN. Например, мы могли бы найти всех продавцов с их заказчиками которые следуют им в алфавитном порядке.