Управл_данными / 11-подзапросы
.pdf
Пример 2 Объединение двух запросов
Теперь объединим эти два запроса путем превращения первого из них в подзапрос:
SELECT cli_id
FROM Orders
WHERE order_num IN (
SELECT order_num
FROM Orderltems
)
WHERE prod_id = 'P001'
Подзапросы всегда обрабатываются, начиная с самого внутреннего оператора SELECT в направлении "изнутри наружу".
Теперь у нас есть идентификаторы всех клиентов, заказавших продукт P001
11
Пример 2 Шаг третий
Следующий шаг состоит в получении клиентской информации для каждого из идентификаторов клиентов:
SELECT cli_name, cli_contact
FROM Client
WHERE cli_id IN
(
SELECT cli_id
FROM Orders
WHERE order_num IN
(
SELECT order_num
FROM Orderltems
)
)
WHERE prod_id = 'P001'
12
Пример 2 Итог
Чтобы выполнить вышеприведенное выражение SELECT, СУБД должна в действительности выполнить три оператора SELECT.
Самый внутренний подзапрос возвращает перечень номеров заказов, который затем используется как предложение WHERE для подзапроса, внешнего по отношению к данному.
Этот подзапрос возвращает перечень
идентификаторов клиентов, которые используются в предложении WHERE запроса более высокого уровня.
Запрос верхнего уровня возвращает искомые данные.
13
Фильтрация с помощью подзапросов - ИТОГИ
За счет использования подзапросов можно создавать очень мощные и гибкие SQL-операторы.
Не существует ограничений на число подчиненных запросов.
Операторы SELECT подзапроса могут выбирать только один столбец. Попытка произвести выборку нескольких столбцов приведет к появлению сообщения об ошибке
14
Использование подзапросов в качестве вычисляемых полей
Другой способ использования подзапросов состоит в использовании вычисляемых полей.
SELECT поле1, поле2, ( ПОДЗАПРОС ), . . .
FROM . . . .
15
Описание БД
16
Пример 1
Задача - написать запрос, который выдает две колонки: название округа и количество областей, которые входя в данный округ.
Для этого в качестве второго поля должен выступать подзапрос, содержащий функцию COUNT() :
SELECT Название,
( SELECT COUNT(*) FROM Регионы WHERE Регионы.Округ = Фед_Округа.kod ) AS Количество
FROM Фед_Округа
17
Пример 2
Задача – выдать спичок округов и их столиц.
В таблице Фед_Округа в поле Столица хранится не название города, а его код
Для того чтобы по коду города узнать его название нужно произвести поиск в таблице Города.
Этот поиск можно поручить подзапросу.
|
|
|
|
|
SELECT Название, |
FROM Города WHERE id = Столица ) |
|
|
( SELECT Город |
|
|
|
FROM Фед_Округа |
|
|
|
|
|
|
18
Пример 2 Примечания
В случае использования подзапросов в качестве полей вложенный запрос должен возвращать не список, а только одно значение.
В приведенном примере в выражении id=Столица поле id - из одной таблицы, а поле Столица - из другой.
В большинстве случаев необходимо уточнять - откуда какое поле.
Это делается с помощью прибавления спереди к имени поля через точку имени таблицы:
Города.id = Фед_Округа.Столица
SELECT Название,
( SELECT Город FROM Города
WHERE Города.id = Фед_Округа.Столица ) FROM Фед_Округа
19
Полные имена полей
В сложных запросах, которые обращаются двум или более таблицам БД, рекомендуется использовать полные имена полей (колонок)
SELECT Фед_Округа.Название,
( SELECT Города.Город FROM Города
)
WHERE Города.id = Фед_Округа.Столица
FROM Фед_Округа
20
