Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен БДиСУБД.doc
Скачиваний:
17
Добавлен:
25.11.2018
Размер:
583.17 Кб
Скачать

19. Вложенный подзапрос. Перечислите и дайте характеристику видам вложенных подзапросов. Приведите примеры. Опишите использование операторов any, all с операторами сравнения.

Вложенный подзапрос - это подзапрос, заключенный в круглые скобки и вложенный в WHERE (HAVING) фразу предложения SELECT. Вложенный подзапрос может содержать в своей WHERE (HAVING) фразе другой вложенный подзапрос и т.д.

Назначение вложенных подзапросов состоит в том, чтобы при отборе строк таблицы, сформированной основным запросом, можно было использовать данные из других.

Виды вложенных подзапросов: простые и коррелированные вложенные подзапросы.

Простые вложенные подзапросы обрабатываются системой "снизу вверх". Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.

Коррелированные вложенные подзапросы обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).

Они включаются в WHERE (HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | > | >= ):

• подзапросы, не возвращающие ни одного или возвращающие несколько значений, начинаются с IN или операторов сравнения и содержат ключевые слова ANY или ALL;

• подзапросы, возвращающие единственное значение, начинаются с оператора сравнения;

• подзапросы, представляющие собой проверку на существование данных, начинаются с EXISTS.

Простые вложенные подзапросы.

Простые вложенные подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN. Оператор IN означает равенство любому из значений, полученных во внутреннем запросе.

Например, нужно выдать название поставщиков книг автором которых является Достоевский.

SELECT Название

FROM Поставщики

WHERE Код_поставщика IN

(SELECT DISTINCT Код_поставщика

FROM Книги

WHERE Автор = ‘Достоевский’);

Система выполняет прежде всего вложенный подзапрос. Этот подзапрос выдает множество уникальных кодов поставщиков, которые поставили книги заданного автора. Затем будет выполнен внешний запрос, результатом которого будут название этих поставщиков.

В подобных запросах можно использовать не только оператор IN, но и операторы сравнения (=,<>, <=, <, >= или >), однако, если вложенный подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка.

Коррелированные вложенные подзапросы.

Например, нужно выдать Код_заказа и Дату_заказа заказчика с именем Чайка Д.Л.

SELECT Код_заказа, Дату_заказа

FROM Заказы

WHERE ‘Чайка Д.Л.’ IN

(SELECT Имя

FROM Заказчики

WHERE Код_заказчика = Заказы.Код_заказчика);

Такой подзапрос отличается тем, что вложенный подзапрос не может быть обработан прежде, чем будет обрабатываться внешний подзапрос, поскольку вложенный подзапрос зависит от значения Заказы.Код_заказчика, а оно изменяется по мере того, как система проверяет различные строки таблицы Заказы.

При использовании в подзапросах с операторами сравнения операторы ANY, ALL необходимо учитывать, что: = ANY ‑ равно любому полученному значению. Соответствует логическому оператору OR.

>ANY (>=ANY) ‑ больше, (больше или равно) чем любое полученное число. Эквивалентно > (>=) для самого меньшего полученного числа.

<ANY (<=ANY) ‑ меньше, (меньше или равно) чем любое полученное число. Эквивалент < (<=) для самого большего полученного числа.

=ALL ‑ равно всем полученным значениям.

>ALL (>=ALL) ‑ больше, (больше или равно) чем все полученные числа. Эквивалент > (> =) для самого большего полученного числа.

<ALL (<=ALL) ‑ меньше, (меньше или равно) чем все полученные числа. Эквивалентно < (< =) самого меньшего полученного числа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]