6.3. Подзапросы

Язык SQL позволяет использовать один запрос в качестве вспомогательного при вычислении другого запроса. Запросы которые являются частью более «крупного» подзапроса, принято называть подзапросом (subquery). Степень взаимной вложенности запросов не ограничивается и может быть произвольной.

Существует четыре типа использования подзапросов:

·         Запросы с использованием UNION, INTERCECT и EXCEPT.

·         Подзапрос возвращает единственное значение, которое сравнивается с другим значением в условии WHERE

·         Запрос возвращает отношение, используемое в выражении WHERE с той или иной целью

·         Запрос оперирует отношениями, перечисленными в предложении в предложении FROM

Подзапросы для вычисления скалярных значений

Атомарное значение, способное выступать в качестве содержимого одного компоненты кортежа отношения называют скаляром (scalar). Запросы вида SELECT - FROM - WHERE могут возвращать отношения с любым количеством атрибутов и кортежей. Однако, зачастую необходимо получать одно единственное значение. Если запрос возвращает единственное значение, он может быть использован в качестве подзапроса, заключенного в круглые скобки и располагаемого в любом месте предложения WHERE, где допустимо использование скалярного значения.

Условия уровня отношения

В SQL предусмотрен ряд операторов, которые применяются к некоторому отношению R в целом, и возвращают скалярное значение булева типа. Некоторые из операторов EXISTS ,IN, ANY, ALL.

·         Условие EXISTS R равно TRUE, если и только если R не пусто.

·         Условие s IN R равно, если и только если s равно одному из значений в R. Напротив s NOT IN R обращается в TRUE, если и только если s не равно ни одному из значений в R.

·         Условие s>ALL R равно TRUE тогда и только тогда если s превосходит все значения в R. Оператор > может быть заменен на =, >=, <=, <, <>. Выражения s<> ALL R и s NOT IN R эквивалентны

·         Условие s>ANY R равно TRUE, если и только если s превосходит по меньшей мере одно значение из R. Выражения s=ANY R и s IN R эквивалентны.

Условия уровня кортежа

SELECT *

FROM R

WHERE (A, B) IN (SELECT C, D FROM S)

Подзапросы в предложениях FROM

Подзапросы могут использоваться в качестве отношений.

Выражения соединения SQL

Декартово произведение = CROSS JOIN

Тета-соединение = R JOIN S ON R.FIELD1=S.FIELD2

Естественное соединение = NATURAL JOIN

Внешнее соединение =       NATURAL FULL OUTER JOIN

NATURAL LEFT OUTER JOIN

NATURAL RIGHT OUTER JOIN