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


SELECT r.aircraft_code, a.model, count( * ) AS num_routes



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

SELECT r.aircraft_code, a.model, count( * ) AS num_routes
FROM routes r
JOIN aircrafts a ON r.aircraft_code = a.aircraft_code
GROUP BY 1, 2
ORDER BY 3 DESC;
aircraft_code |
model
| num_routes
---------------+---------------------+------------
CR2
| Bombardier CRJ-200 |
232
CN1
| Cessna 208 Caravan |
170
SU9
| Sukhoi SuperJet-100 |
158
319
| Airbus A319-100
|
46
733
| Boeing 737-300
|
36
321
| Airbus A321-200
|
32
763
| Boeing 767-300
|
26
773
| Boeing 777-300
|
10
(8 строк)
159


Глава 6. Запросы
Обратите внимание, что таблица «Самолеты» содержит 9 моделей, а в этой выборке
лишь 8 строк. Значит, какая-то модель самолета не участвует в выполнении рейсов.
Как ее выявить?
С помощью такого запроса:
SELECT a.aircraft_code AS a_code,
a.model,
r.aircraft_code AS r_code,
count( r.aircraft_code ) AS num_routes
FROM aircrafts a
LEFT OUTER JOIN routes r ON r.aircraft_code = a.aircraft_code
GROUP BY 1, 2, 3
ORDER BY 4 DESC;
a_code |
model
| r_code | num_routes
--------+---------------------+--------+------------
CR2
| Bombardier CRJ-200 | CR2
|
232
CN1
| Cessna 208 Caravan | CN1
|
170
SU9
| Sukhoi SuperJet-100 | SU9
|
158
319
| Airbus A319-100
| 319
|
46
733
| Boeing 737-300
| 733
|
36
321
| Airbus A321-200
| 321
|
32
763
| Boeing 767-300
| 763
|
26
773
| Boeing 777-300
| 773
|
10
320
| Airbus A320-200
|
|
0
(9 строк)
В данном запросе используется левое внешнее соединение — об этом говорит пред-
ложение LEFT OUTER JOIN.
В качестве базовой таблицы выбирается таблица aircrafts, указанная в запросе
слева от предложения LEFT OUTER JOIN, и для каждой строки, находящейся в ней, из
таблицы routes подбираются строки, в которых значение атрибута aircraft_code
такое же, как и в текущей строке таблицы aircrafts. Если в таблице routes нет ни
одной соответствующей строки, то при отсутствии ключевых слов LEFT OUTER ре-
зультирующая комбинированная строка просто не будет сформирована и не попадет
в выборку. Но при наличии ключевых слов LEFT OUTER результирующая строка все
равно будет сформирована.
Это происходит таким образом: если для строки из левой таблицы (левой относитель-
но предложения LEFT OUTER JOIN) не находится ни одной соответствующей строки
160


6.2. Соединения
в правой таблице, тогда в результирующую строку вместо значений столбцов пра-
вой таблицы будут помещены значения NULL. Получается, что для строки из табли-
цы aircrafts, в которой значение атрибута aircraft_code равно 320, в таблице
routes нет ни одной строки с таким же значением этого атрибута. В результате при
выводе выборки в столбце a_code, взятом из таблицы aircrafts, будет значение
320, а в столбце r_code, взятом из таблицы routes, будет значение NULL. Этот стол-
бец включен в выборку лишь для повышения наглядности, в реальном запросе он не
нужен.
Обратите внимание, что параметром функции count является столбец из таблицы
routes, поэтому count и выдает число 0 для самолета с кодом 320. Если заменить
его на одноименный столбец из таблицы aircrafts, тогда count выдаст 1, что бу-
дет противоречить цели нашей задачи — подсчитать число рейсов, выполняемых на
самолетах каждого типа. Напомним, что если функция count в качестве параметра
получает не символ «∗», а имя столбца, тогда она подсчитывает число строк, в кото-
рых значение в этом столбце определено (не равно NULL).
Кроме левого внешнего соединения существует также и правое внешнее соедине-
ние
— RIGHT OUTER JOIN.
В этом случае в качестве базовой выбирается таблица, имя которой указано справа от
предложения RIGHT OUTER JOIN, а механизм получения результирующих строк в слу-
чае, когда для строки базовой таблицы не находится пары во второй таблице, точно
такой же, как и для левого внешнего соединения. Как сказано в документации, пра-
вое внешнее соединение является лишь синтаксическим приемом, поскольку всегда
можно заменить его левым внешним соединением, поменяв при этом имена таблиц
местами.
Важно учитывать, что порядок следования таблиц в предложениях LEFT (RIGHT)
OUTER JOIN никак не влияет на порядок столбцов в предложении SELECT. В выше-
приведенном запросе мы написали


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




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

    Басты бет