SELECT count( * ) FROM bookings
WHERE total_amount >
( SELECT avg( total_amount ) FROM bookings );
count
-------
87224
(1 строка)
В приведенном запросе присутствует два предложения SELECT, но при этом толь-
ко одно из них является главным в этом запросе, а другое представляет собой под-
запрос
. Он заключается в круглые скобки и является частью более общего запроса.
Подзапросы могут присутствовать в предложениях SELECT, FROM, WHERE и HAVING,
а также в предложении WITH, о котором мы расскажем позднее.
В приведенном примере в предложении WHERE используется так называемый ска-
лярный подзапрос
. Это означает, что в результате его выполнения возвращается
только одно скалярное значение (один столбец и одна строка), с которым можно срав-
нивать другие скалярные значения.
Если подзапрос выдает множество скалярных значений (или даже только одно), мож-
но использовать такой подзапрос в предикате IN. Этот предикат позволяет органи-
зовать проверку на предмет принадлежности какого-либо значения определенному
множеству значений.
В качестве примера давайте выясним, какие маршруты существуют между городами
часового пояса Asia/Krasnoyarsk. Подзапрос будет выдавать список городов из это-
го часового пояса, а в предложении WHERE главного запроса с помощью предиката
IN будет выполняться проверка на принадлежность города этому списку. При этом
подзапрос выполняется только один раз для всего внешнего запроса, а не при обра-
ботке каждой строки из таблицы routes во внешнем запросе. Повторного выполне-
ния подзапроса не требуется, т. к. его результат не зависит от значений, хранящихся
в таблице routes. Такие подзапросы называются некоррелированными.
177
Глава 6. Запросы
Достарыңызбен бөлісу: |