Оператор выборки в Transact-SQL. Использование представлений (Лабораторная работа № 3), страница 4

В этом запросе группируются данные, взятые из трех исходных таблиц: 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 будет выглядеть следующим образом: