Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Управл_данными / 11-подзапросы

.pdf
Скачиваний:
21
Добавлен:
03.06.2015
Размер:
765 Кб
Скачать
☆

Пример 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

Соседние файлы в папке Управл_данными