Учебно-практическое пособие москва 2017 ббк



Pdf көрінісі
бет135/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   131   132   133   134   135   136   137   138   ...   243
Байланысты:
Язык SQL. Базовый курс

предикат EXISTS
(или NOT
EXISTS).
В качестве примера выясним, в какие города нет рейсов из Москвы.
SELECT DISTINCT a.city
FROM airports a
WHERE NOT EXISTS (
SELECT * FROM routes r
WHERE r.departure_city = 'Москва'
AND r.arrival_city = a.city
)
AND a.city <> 'Москва'
ORDER BY city;
В этом запросе мы не можем ограничиться только лишь материализованным пред-
ставлением «Маршруты» (routes), поскольку в нем представлены лишь
существующие
маршруты. Полный список городов можно найти в таблице «Аэропорты» (airports).
Для каждой строки (каждого города) из таблицы airports выполняется поиск строки
в представлении routes, в которой значение атрибута arrival_city такое же, как в те-
кущей строке таблицы airports. Если такой строки не найдено, значит, в этот город
маршрута из Москвы нет.
Поскольку от подзапроса в предикате EXISTS требуется только установить факт на-
личия или отсутствия строк, соответствующих критерию отбора, то в документации
рекомендуется вместо списка столбцов (или символа «*») в предложении SELECT де-
лать так:
WHERE NOT EXISTS ( SELECT 1 FROM routes r ...
Обратите внимание на ключевое слово DISTINCT в запросе. Оно необходимо, т. к.
кроме Москвы могут быть другие города, в которых есть более одного аэропорта.
Один такой город уже существует — Ульяновск. Если не использовать DISTINCT, то, в
принципе, возможно появление строк-дубликатов в выборке.
И еще одна важная деталь. В представленном запросе мы использовали так называ-
емый
коррелированный (связанный) подзапрос
. В подзапросах такого типа при-
сутствует ссылка (ссылки) на таблицу из внешнего запроса, как здесь:
WHERE ...
AND r.arrival_city = a.city
В теории это означает, что подзапрос выполняется не один раз для всего внешнего за-
проса, а
для каждой строки
, обрабатываемой во внешнем запросе. Однако на практи-
ке важную роль играет умение планировщика (это специальная подсистема в СУБД)
оптимизировать подобные запросы с тем, чтобы, по возможности, избегать выпол-
нения подзапроса для каждой строки из внешнего запроса.
Получаем такой результат:
city
----------------------
Благовещенск
Иваново
...
138


Якутск
Ярославль
(20 строк)
Рассмотрим использование подзапросов в предложениях SELECT, FROM и HAVING.
Предположим, что для выработки ценовой политики авиакомпании необходимо
знать, как распределяются места разных классов в самолетах всех типов. Первый ва-
риант решения этой задачи основан на включении


Достарыңызбен бөлісу:
1   ...   131   132   133   134   135   136   137   138   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет