- •10.1. Итоговые запросы на чтение
- •10.1.1. Агрегатные функции
- •10.1.2. Использование агрегатных функций
- •10.1.3. Агрегатные функции и значения null
- •10.2. Запросы с группировкой
- •10.2.1. Ограничения на запросы с группировкой
- •10.2.2. Условия поиска групп
- •10.3. Вложенные запросы на чтение
- •10.4. Условия поиска с вложенным запросом
- •Вопросы для самоконтроля
10.1. Итоговые запросы на чтение
Многие запросы к БД не нуждаются в той степени детализации, которую обеспечивают SQL-запросы, рассмотренные в предыдущих примерах. Так, во всех запросах перечисленных далее, требуется узнать всего одно или несколько значений, которые подытоживают информацию, содержащуюся в БД:
какова сумма доходов у всех жителей?
каковы наибольший и наименьший общий доход отдельного жителя?
каков среднедушевой доход жителя Зеленограда?
каков среднедушевой доход жителей каждой квартиры?
сколько жителей в каждой квартире?
На языке SQL запросы такого типа можно создавать с помощью агрегатных функций и предложений GROUP BY и HAVING, используемых в операторе SELECT.
10.1.1. Агрегатные функции
Для подведения итогов по информации, содержащейся в БД, в SQL предусмотрены агрегатные функции. Агрегатная функция принимает в качестве аргумента какой-либо столбец данных целиком, а возвращает одно значение, которое определенным образом подытоживает этот столбец.
Например, агрегатная функция AVG( ) принимает в качестве аргумента столбец чисел и вычисляет их среднее значение.
Чтобы вычислить среднедушевой доход жителя Зеленограда, нужен такой запрос:
SELECT ‘СРЕДНЕДУШ.ДОХОД=’, AVG(SUMD)
FROM PERSON
В SQL имеется шесть агрегатных функций, которые позволяют получать различные виды итоговой информации (рис. 10.1):
SUM( ) вычисляет сумму всех значений, содержащихся в столбце;
AVG( ) вычисляет среднее среди значений, содержащихся в столбце;
MIN( ) находит наименьшее среди всех значений, содержащихся в столбце;
MAX( ) находит наибольшее среди всех значений, содержащихся в столбце;
COUNT( ) подсчитывает количество значений, содержащихся в столбце;
COUNT(*) подсчитывает количество строк в таблице результатов запроса.
Аргументом агрегатной функции может быть простое имя столбца, как в предыдущем примере, или выражение, как в следующем запросе, задающем вычисление среднедушевого налога:
SELECT AVG(SUMD*0.13)
FROM PERSON
При выполнении этого запроса создается временный столбец, содержащий значения (SUMD*0.13) для каждой строки таблицы PERSON, а затем вычисляется среднее значение временного столбца.
Сумму доходов у всех жителей Зеленограда можно вычислить с помощью агрегатной функции SUM:
SELECT SUM(SUMD) FROM PERSON
Агрегатная функция может быть использована и для вычисления итогов по таблице результатов, полученной соединением нескольких исходных таблиц. Например, можно вычислить общую сумму дохода, которая получена жителями от источника с названием “Стипендия”:
SELECT SUM(MONEYS)
FROM PROFIT, HAVE_D
WHERE PROFIT.ID=HAVE_D.ID
AND PROFIT.SOURCE=’Стипендия’
Агрегатные функции MIN( ) и MAX( ) позволяют найти соответственно наименьшее и наибольшее значения в таблице. При этом столбец может содержать числовые или строковые значения либо значения даты или времени.
Например, можно определить
(а) наименьший общий доход, полученный жителями, и наибольший налог, подлежащий уплате:
SELECT MIN(SUMD), MAX(SUMD*0.13)
FROM PERSON
(б) даты рождения самого молодого и самого старого жителя:
SELECT MIN(RDATE), MAX(RDATE)
FROM PERSON
(в) даты рождения самого первого и самого последнего жителя в списке, упорядоченном по алфавиту:
SELECT MIN(FIO), MAX(FIO)
FROM PERSON
Применяя эти агрегатные функции, нужно помнить, что числовые данные сравниваются по арифметическим правилам, сравнение дат происходит последовательно (более ранние значения дат считаются меньшими, чем более поздние), сравнение интервалов времени выполняется на основании их продолжительности.
При использовании функции MIN( ) и MAX( ) со строковыми данными результат сравнения двух строк зависит от используемой таблицы кодировки. На персональных компьютерах и мини-компьютерах, где используется таблица кодировки ASCII, в последовательности сортировки цифры идут перед буквами, а все прописные буквы предшествуют строчным буквам. На больших компьютерах (мэикфреймах) фирмы IBM (например, AS/400), где используется таблица кодировки EBCDIC, строчные символы расположены перед прописными, а цифры следуют за буквами.