Вы находитесь на странице: 1из 6

1

Использование итоговых (агрегатных) функций

В операторе SELECT можно использовать агрегатные функции, которые дают


единственное значение для целой группы строк в таблице.
Агрегатная функция записывается в следующем виде:
<имя функции>(<имя столбца>)
Пользователю доступны следующие агрегатные функции:
SUM - вычисляет сумму множества значений указанного столбца;
COUNT - вычисляет количество значений указанного столбца;
MIN/MAX- определяет минимальное/максимальное значение в указанном
столбце;
AVG - вычисляет среднее арифметическое значение множества значений столбца;
FIRST/LAST - определяет первое/последнее значение в указанном столбце.

Пример 1.
Определить общий объем читаемых дисциплин.
SELECT SUM(volume)
FROM SUB
Столбцы результирующей таблицы, которых не существовало в исходных
таблицах, называются вычисляемыми. Таким столбцам СУБД присваивает системные
имена, что не всегда является удобным.

Результат запроса:

Expr1000
500

Язык SQL позволяет задавать новые имена столбцам результирующей таблицы,


для чего используется операция AS. Переименование также используют для изменения
сложных имен столбцов таблицы.
Например, присвоить новое имя вычисляемому столбцу в примере 1 позволит
выполнение следующего запроса.
SELECT SUM(volume)AS SUM
FROM SUB
Результат запроса:
SUM
500

Пример 2.
Определить количество студентов, которые посетили хоть один экзамен.
SELECT COUNT(studnum)AS COUNT
FROM STUD
Результат запроса:
COUNT
6
Несмотря на то, что реальное число таких студентов в таблице STUD равно 3,
СУБД возвращает число 6. Такой результат объясняется тем, что СУБД подсчитывает все
строки в таблице STUD, не обращая внимание на то, что в строках есть одинаковые
2
значения. Если до применения агрегатной функции необходимо исключить
дублирующиеся значения, следует перед именем столбца указать ключевое слово
DISTINCT.
SELECT COUNT(DISTINCT studnum)AS COUNT
FROM STUD

Результат запроса:

COUNT
3

При вычислении результатов любой агрегатной функции СУБД сначала


исключает все NULL-значения, после чего требуемая операция применяется к оставшимся
значениям. Для функции COUNT возможен особый вариант использования - COUNT(*).
Его назначение состоит в подсчете всех строк в результирующей таблице, включая NULL-
значения.
Ограничить множество строк, к которым впоследствии будет применяться
агрегатная функция, позволяет использование предложения WHERE. В этом случае
строки сначала отбираются в соответствии с критериями, указанными в предложении
WHERE, а затем к выбранным строкам применяется агрегатная функция.

Пример 3.
Определить максимальную оценку студента с номером 1.
SELECT MAX(mark)AS MAX
FROM EXAM
WHERE studnum=1
Результат запроса:

MAX
5

Следует запомнить, что агрегатные функции нельзя вкладывать друг в друга,


например, MAX( SUM (VOLUME)).

Предложение GROUP BY
Использование GROUP BY позволяет разбивать таблицу на логические группы и
применять агрегатные функции к каждой из этих групп. В результате получим
единственное значение для каждой группы. Обычно предложение GROUP BY применяют,
если формулировка задачи содержит фразу «для каждого…», «каждому..» и т.п.
Пример 4.
Определить средний балл каждого студента.
SELECT studnum, AVG(mark)AS AVG
FROM EXAM
GROUP BY studnum
Выполнение запроса можно описать следующим образом: СУБД разбивает
таблицу PD на три группы, в каждую из групп помещаются строки с одинаковым
значением номера поставщика (см. рисунок). Затем к каждой из полученных групп
применяется агрегатная функция SUM, что дает единственное итоговое значение для
каждой группы.
3

Результат запроса:

studnum AVG
1 4
2 5
3 2

Рассмотрим два похожих примера.

В примере 1 определяется минимальная оценка каждого студента. В примере 2


определяется минимальная оценка среди всех студентов.
Пример 1 Пример 2
Определить минимальную оценку для каждого Определить минимальную оценку для
студента. всех студентов.
SELECT studnum, MIN(mark) AS MIN SELECT MIN(mark) AS MIN
FROM EXAM FROM EXAM
GROUP BY studnum

Результаты запросов представлены в следующей таблице:

studnum MIN MIN


1 3 2
2 5
3 2

Следует обратить внимание, что в первом примере мы можем вывести номера


студентов, соответствующие значению оценки, а во втором примере – не можем.

Все имена столбцов, перечисленные после ключевого слова SELECT должны


присутствовать и в предложении GROUP BY, за исключением случая, когда имя столбца
является аргументом агрегатной функции.

Однако в предложении GROUP BY могут быть указаны имена столбцов, не


перечисленные в списке вывода после ключевого слова SELECT.
Если предложение GROUP BY расположено после предложения WHERE, то
группы создаются из строк, выбранных после применения WHERE.
4
Пример 5.
Для каждой из дисциплин с номерами 1 и 2 определить количество студентов,
которые их сдавали, а также средний балл по данной дисциплине.
SELECT subnum, COUNT(studnum)AS COUNT, AVG(volume) AS AVG
FROM EXAM
WHERE subnum=1 OR subnum =2
GROUP BY subnum

Результат запроса:
subnum COUNT AVG
1 3 4
2 2 4,5

Чтобы организовать вложенные группировки после GROUP BY следует указать


несколько группирующих столбцов через запятую.

Предложение HAVING

Предложение HAVING определяет критерий, согласно которому определенные


группы, сформированные с помощью предложения GROUP BY, исключаются из
результирующей таблицы.
Выполнение предложения HAVING сходно с выполнением предложения
WHERE. Но предложение WHERE исключает строки до того как выполняется
группировка, а предложение HAVING - после. Поэтому предложение HAVING может
содержать агрегатные функции, а предложение WHERE - не может.

Пример 6
Определить номера студентов, средний балл которых превышает балл 3.
SELECT studnum, AVG(mark)AS SUM
FROM EXAM
GROUP BY studnum
HAVING AVG(mark)>3
Результат запроса:
studnum AVG
1 4
2 5

Пример 7
Определить номера студентов, которые cдавали только один экзамен.
SELECT studnum, COUNT(distinct subnum)AS COUNT
FROM EXAM
GROUP BY studnum
HAVING COUNT(distinct subnum)=1
Результат запроса:
studnum COUNT
3 1
5
Предложение ORDER BY

При выполнении запроса СУБД возвращает строки в случайном порядке.


Предложение ORDER BY позволяет упорядочить выходные данные запроса в
соответствии со значениями одного или нескольких выбранных столбцов.
Можно задать возрастающий (ASC от слова Ascend) или убывающий (DESC от
слова Descend) порядок сортировки. По умолчанию принят возрастающий порядок
сортировки.
Пример 8
Отсортировать таблицу EXAM в порядке возрастания номеров предметов, а
строки с одинаковыми значениями subnum отсортировать в порядке убывания значений
оценок.
SELECT studnum, subnum, mark
FROM EXAM
ORDER BY subnum ASC, mark DESC, studnum ASC
Результат запроса:
studnum subnum mark
1 1 5
2 1 5
3 1 2
2 2 5
1 2 4
1 3 3

Использование операции TOP

Итоговый набор записей, получаемых после выполнения запроса можно


ограничить первыми N строками или первыми N процентами от общего количества строк
результата. Для этого используется операция TOP, которая записывается в предложении
SELECT следующим образом:
SELECT TOP N [PERCENT] <список столбцов>
Пример 9
Определить номера первых двух предметов в таблице SUB.
SELECT TOP 2 subnum
FROM SUB

subnum
1
2

Операцию TOP удобно применять после сортировки результирующего набора с


помощью предложения ORDER BY.

Пример 10
Определить номера первых двух предметов с наименьшим объемов часов.
SELECT TOP 2 subnum
FROM SUB
ORDER BY subvolume ASC
6
Стандарт SQL требует, чтобы при сортировке NULL-значения трактовались либо
как превосходящие, либо как уступающие по сравнению со всеми остальными
значениями. Так как конкретный вариант стандартом не оговаривается, то в зависимости
от используемой СУБД при сортировке NULL-значения следуют до или после остальных
значений. В MS SQL Server NULL-значения считаются уступающими по сравнению с
остальными значениями.
Следует отметить, что если в таблице SUB будут два предмета без указания
объема часов, то именно их и отобразит предыдущий запрос. Поэтому при наличии
NULL-значений их необходимо исключать с помощью предложения WHERE. Пример 10
можно преобразовать следующий образом:
SELECT TOP 2 subnum
FROM SUB
WHERE subvolume IS NOT NULL
ORDER BY subvolume ASC

Вам также может понравиться