Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка SQL(14) (оптимизация).docx
Скачиваний:
62
Добавлен:
17.03.2015
Размер:
452.16 Кб
Скачать

Глава 4. Подзапросы и производные таблицы

С помощью SQL вы можете вкладывать запросы внутрь друг друга. В этом случае говорят о запросе с подзапросом.

4.1.Производная таблица.

Синтаксис SQL позволяет в предложении FROM кроме базовых таблиц использовать любое выражение, генерирующее табличную структуру. Рассмотрим пример

Пример 24.

Выдать меню на 02-01-2011.

SELECT a.Блюдо, cast(a. Стоимость as numeric(6,2)) as [Цена за порцию]

FROM

(SELECT b.Блюдо, b.ID_блюда,

SUM(s.Вес*n.Цена/1000)+b.Труд as Стоимость

FROM (Блюда b JOIN Состав s ON b.ID_блюда = s.Блюдо )

JOIN Наличие n ON s.Продукт = n.Продукт

GROUP BY b.Блюдо, b.ID_блюда, b.Труд ) a

JOIN Меню m ON m.Блюдо = a.ID_блюда

WHERE Дата = '2011-01-02'

ORDER BY Вид;

Результат

Блюдо

Цена за порцию

Салат летний

25.00

Салат мясной

38.63

Паштет из рыбы

12.04

Суп харчо

48.50

Суп молочный

35.97

Бефстроганов

55.15

Судак по-польски

13.37

Суфле яблочное

40.93

Кофе на молоке

12.02

Производная таблица — это весь запрос SELECT, помещённый в скобках (скобки являются частью синтаксиса и предназначены для выделения запроса). В примере производная таблица имеет псевдоним а.

Производная таблица — это общий случай подзапроса, запроса, который вложен в другой запрос или зависит от него. Производные таблицы чрезвычайно полезны в SQL.

В запросе используется функция преобразования типа —

cast(a. Стоимость as numeric(6,2))

её синтаксис:

CAST ( выражение AS тип_данных [ (длина) ])

4.2. Вложенные подзапросы

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

Существуют простые и соотнесенные вложенные подзапросы.

Они включаются в WHERE (HAVING) фразу с помощью предикатов IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | > | >= ). Простые вложенные подзапросы обрабатываются системой "снизу вверх". Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.

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

Следует отметить, что SQL обладает большой избыточностью в том смысле, что он часто предоставляет несколько различных способов формулировки одного и того же запроса. Поэтому во многих примерах мы будем использовать уже знакомые формулировки запросов. Кроме того, разные формулировки одного и того же запроса требуют для своего выполнения различных ресурсов памяти и могут значительно отличаться по времени реализации в разных СУБД.