Управл_данными / 11-подзапросы
.pdfУправление данными
SQL Подзапросы
Зудилин А.Э. 2013
Подзапросы
Операторы SELECT представляют собой запросы SQL.
Все операторы SELECT, с которыми мы имели дело до сих пор, представляли собой простые запросы: посредством оператора SELECT извлекались данные из одной таблицы.
Язык SQL позволяет также создавать сложные запросы: запросы, в которые вложены другие запросы.
Вложенные запросы называют также подзапросами или подчиненными запросами
2
Два типа подзапросов
Существует два способа использования подзапросов:
1)Фильтрация посредством подзапросов - подзапрос, определяет фильтр в предложении WHERE (в операторе IN)
2)Использование подзапросов в качестве вычисляемых полей
3
Фильтрация с помощью подзапросов
SELECT . . . .
FROM . . . .
WHERE . . . IN( ПОДЗАПРОС )
. . . .
4
Описание БД
Чаще всего в реляционных БД приходится собирать информацию из нескольких таблиц.
5
Использование оператора IN
впростом запросе
Для того чтобы выбрать все области входящие в округа с номерами 1,3,7 нужно выполнить запрос:
SELECT Название
FROM Регионы
WHERE Округ IN( 1,3,7 )
В этом запросе, после оператора IN
в скобках указывается список значений, которые должно принимать поле «Округ».
Список значений здесь сформирован вручную
6
Подзапрос в операторе IN
Можно поручить формирование списка другому запросу SELECT, вставив его вместо списка.
Такой запрос называется вложенным запросом (или подзапросом)
|
|
|
|
|
|
SELECT Название |
|
|
|
|
FROM Регионы |
SELECT kod FROM Фед_округа WHERE |
|
|
|
WHERE Округ IN( |
|
||
|
Название LIKE '*ск*' |
) |
|
|
|
|
|
|
|
Красным цветом выделен подзапрос, создающий список кодов округов
При отладке такого сложного запроса рекомендуется сначала отдельно написать вложенный запрос, убедиться, что он работает, затем скопировать его и вставить в основной (главный) запрос
7
Пример 2
Таблица Orders (заказы) содержит по одной строке для каждого заказа; в ней указываются номер заказа, идентификатор клиента и дата заказа.
Предметы отдельного заказа хранятся в соответствующей таблице
Order_ltems.
Таблица Orders не содержит информацию о клиентах. Она хранит только идентификатор клиента. Информация о клиентах хранится в таблице Client (клиенты)
8
Пример 2
Предположим, что вы хотите получить перечень всех клиентов, которые заказали продукт P001.
Для этого нужно сделать следующее.
1)Выбрать номера всех заказов, в которых содержится продукт P001.
2)Выбрать идентификатор клиента для всех клиентов, которые имеют заказы, перечисленные среди номеров заказов, возвращенных на предыдущем шаге.
3)Выбрать информацию о клиенте для всех клиентов, идентификаторы которых были возвращены на предыдущем шаге
9
Пример 2 Серия простых запросов
Каждый из этих шагов можно выполнить в виде отдельного запроса.
Первый оператор SELECT выбирает столбец order_num для всех продуктов заказа, у которых в столбце prod_id значится P001:
SELECT order_num
FROM Order_Items
WHERE prod_id = 'P001'
Допустим, что результатом этого запроса является список : 104, 105.
Следующий шаг состоит в выборке идентификаторов клиентов, связанных с заказами 104 и 105.
SELECT cli_id
FROM Orders
WHERE order_num IN (104, 105)
10