В этом запросе группируются данные, взятые из трех исходных таблиц: coaches, seats и passengers_seats. Условия в секции where служат для реализации реляционной операции соединения таблиц (см. далее). Группирование производится по столбцу coach_type таблицы coaches, а агрегирование – по столбцу price таблицы passengers_seats. Агрегатная функция avg() подсчитывает среднее значение атрибута price для каждого типа вагонов, т. е. отдельно для купейных, отдельно для СВ и т. д.
Результат этого запроса может выглядеть так:
coach_type avg(price)
---------------- --------------
Купе 1550
СВ 4000
Принцип работы функций sum(), min(), max() и count() с явным указанием столбца аналогичен avg().
Примечание 1. Если секция groupby отсутствует, агрегатные функции могут использоваться соответственно:
· count(столбец) – для подсчета не-NULL значений в столбце;
· count(*) – для подсчета общего количества записей в таблице;
· sum(), min(), max(), avg() – для нахождения суммарного, минимального, максимального и среднего значений в указанном столбце.
Примечание 2. Столбцы, не участвующие в группировании, не могут указываться в списке выражений, за исключением тех случаев, когда они присутствуют в качестве аргументов агрегатных функций.
2.1.6. Предложение having
Предложение having используется совместно с groupby и играет ту же роль для групп, что и WHERE для негруппированной таблицы: секция having позволяет отобрать из набора групп только те группы, которые удовлетворяют заданному условию.
Для примера возьмем запрос из предыдущего пункта (запрос о типах вагонов и средних ценах на билеты), но отобразим только те типы вагонов, где средняя цена на билеты превышает 3000. Запрос будет выглядеть следующим образом:
select coach_type, avg(price)
from coaches, seats, passengers_seats
where passengers_seats.id_seat = seats.id_seat
and seats.id_coach = coaches.id_coach
groupby coach_type
havingavg(price) > 3000
2.1.7. Предложение orderby
Предложение order by служит для упорядочения результирующего набора строк по значениям одного или нескольких столбцов. Синтаксис данного предложения имеет вид:
order by {столбец [asc | desc]} [,…n]
Ключевые слова asc и desc определяют способ сортировки: asc – по возрастанию, desc – по убыванию.
Приведем типичный пример использования сортировки. Следующий запрос выдает список пассажиров, упорядоченный по фамилиям и инициалам в алфавитном порядке:
select *
from passengers
order by pas_name asc, pas_initials asc
Ключевое слово asc можно не указывать, т. к. сортировка в порядке возрастания выполняется по умолчанию. Поэтому приведенный запрос может выглядеть и так:
select *
from passengers
order by pas_name, pas_initials
Заметим, что предложение orderby влияет только на порядок строк результирующего набора данных. В исходных таблицах БД не меняется при этом ничего.
2.2. Использование функций Transact-SQL в запросах
Список выражений после ключевого слова select может состоять не только собственно из имен столбцов, но также включать выражения, в которых множество операндов соединены знаками операций. При этом столбцы часто фигурируют как операнды в этих выражениях, а также как аргументы арифметических, строковых и других функций.
Рассмотрим следующий запрос:
select pas_name, pas_initials
from passengers
Результирующий набор данных будет состоять из двух столбцов: pas_name и pas_initials. Столбец pas_name включает фамилии пассажиров, а pas_initials – инициалы, причем, по условию примера, инициалы записываются без точек и без пропусков: например, ‘ИА’. При помощи функций Transact-SQL можно изменить этот запрос таким образом, чтобы он выдавал информацию в более привычном для пользователей виде – например, два столбца в один столбец, где будут вместе храниться фамилии и инициалы в формате ‘Фамилия И. О.’. Такой запрос в Transact-SQL будет выглядеть следующим образом:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.