Учебное пособие Санкт-Петербург «бхв-петербург»



Pdf көрінісі
бет126/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   122   123   124   125   126   127   128   129   ...   256
sql osnovi yazika

SELECT count( * )
FROM airports a1, airports a2
WHERE a1.city <> a2.city;
Как мы уже говорили ранее, СУБД соединяет каждую строку первой таблицы с каж-
дой строкой второй таблицы, т. е. формирует декартово произведение таблиц — все
попарные комбинации строк из двух таблиц. Затем СУБД отбрасывает те комбини-
рованные строки, которые не удовлетворяют условию, приведенному в предложении
WHERE. В нашем примере условие как раз и отражает требование о том, что рейсов из
одного города в тот же самый город быть не должно.
count
-------
10704
(1 строка)
Во втором варианте запроса мы используем соединение таблиц на основе нера-
венства значений атрибутов
. Тем самым мы перенесли условие отбора результи-
рующих строк из предложения WHERE в предложение FROM.
SELECT count( * )
FROM airports a1
JOIN airports a2 ON a1.city <> a2.city;
count
-------
10704
(1 строка)
158


6.2. Соединения
Третий вариант предусматривает явное использование декартова произведения
таблиц
. Для этого служит предложение CROSS JOIN. Лишние строки, как и в первом
варианте, отсеиваем с помощью предложения WHERE:
SELECT count( * )
FROM airports a1 CROSS JOIN airports a2
WHERE a1.city <> a2.city;
count
-------
10704
(1 строка)
С точки зрения СУБД эти три варианта эквивалентны и отличаются лишь синтакси-
сом. Для них PostgreSQL выберет один и тот же план (порядок) выполнения запроса.
Теперь обратимся к так называемым внешним соединениям. Зададимся вопросом:
сколько маршрутов обслуживают самолеты каждого типа? Если не требовать вывода
наименований моделей самолетов, тогда всю необходимую информацию можно по-
лучить из материализованного представления «Маршруты» (routes). Но мы все же
будем выводить и наименования моделей, поэтому обратимся также к таблице «Са-
молеты» (aircrafts). Соединим эти таблицы на основе атрибута aircraft_code,
сгруппируем строки и просто воспользуемся функцией count. В этом запросе внеш-
нее соединение еще не используется.


Достарыңызбен бөлісу:
1   ...   122   123   124   125   126   127   128   129   ...   256




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

    Басты бет