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

            select train_number, train_name

                       from trains

                       where exists

                                   (select * from coaches

                                               where id_train = trains.id_train

                                               and coach_type = ‘СВ’)

Этот запрос является коррелированным. Выполняя его, СУБД перебирает все строки таблицы trains, но в результирующий набор попадают только те, с которыми связана хотя бы одна строка таблицы coaches с полем coach_type = ‘СВ’.

С квантором существования может быть использовано отрицание not. Если применить это отрицание в предыдущем примере, СУБД будет искать все поезда, в которых нет вагонов СВ:

            select train_number, train_name

                       from trains

                       where not exists

                                   (select * from coaches

                                               where id_train = trains.id_train

                                               and coach_type = ‘СВ’)

2.5. Представления как хранимые на сервере запросы

Представление, с точки зрения разработчика, является именованным select-запросом, SQL-код которого постоянно хранится в БД вместе с таблицами и всегда доступен для запуска на выполнение. С точки зрения пользователя БД, представление – это своего рода виртуальная таблица, содержимое которой генерируется автоматически на основе результата выполнения запроса. Работа с представлением для обычного пользователя БД практически не отличается от работы с таблицей. Имя представления может использоваться в select-запросах наравне с именем таблицы, в некоторых случаях разрешается даже добавление и модификация данных в представлениях. Однако существуют и внешние различия между представлениями и таблицами. Они будут вкратце рассмотрены позже.

2.5.1. Создание представления

Для создания представлений служит команда createview, имеющая следующий упрощенный синтаксис:

createview [имя_БД.][имя_схемы.]имя_представления

           [(столбец [,…n])]

           as запрос

Имена БД и схемы могут быть опущены. В этом случае по умолчанию принимаются имя текущей БД и схема текущего пользователя.

Имя представления должно быть уникальным в пределах БД.

С помощью параметра (столбец [, …n]) столбцам представления присваиваются новые имена. Количество элементов этого списка должно соответствовать количеству столбцов, возвращаемых запросом. По умолчанию принимаются имена столбцов, указанных в запросе после ключевого слова select. Поэтому задавать новые имена для столбцов представления требуется только в особых случаях:

·  когда столбцы получены на основе результатов вычислений;

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

Проиллюстрируем оба случая соответствующими примерами.

Предположим, требуется создать представление на основе следующего запроса:

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

Результирующий набор данных, выдаваемых по этому запросу, имеет два столбца, причем второй – безымянный. При создании представления необходимо задать имя для столбца, хранящего среднюю цену на билеты. Сделать это можно двумя способами. Первый способ – указать перечень столбцов в операторе create view:

            create view coach_types_prices (coach_type, average_price)

            as

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