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

Лекция 8

WHERE EXISTS

SELECT

Название_товара

FROMТовары

(SELECT ID_категории

FROMКатегории_товаров

WHERE Товары.Категория = Категории_товаров.ID_товара)

Тот же самый результат можно было получить с помощью запроса

 

SELECT Товар.Название

FROM Категории INNER JOIN Товар

ON Категория.ID_категории=Товар.Категория

WHERE Категория.Название='Хлебобулочные'

Задания для самостоятельной работы (Лаб. 4)

1. Вывести список поставщиков, у которых в базе данных не указан телефон.

2. Вывести список категории товаров, которые ни разу не продавались.

3. Вывести список невостребованных товаров (тех товаров, которые не продавались за последние 3 месяца.

4. Найти фирмы, в сделках которых количество товара превышает такой же показатель хотя бы в одной сделке клиентов из Самары.

5. Определить имеются ли в наличии товары из категории «Мясные».

6. Вывести список клиентов, покупающих товары только одной категории.

 

Часто невозможно решить поставленную задачу путем одного запроса. Это особенно актуально, когда при использовании условия поиска в предложении WHERE значение, с которым нужно сравнивать, заранее не определено и должно быть вычислено в момент выполнения оператора.

В таком случае используются операторы SELECT, встроенные в тело другого оператора SELECT.

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

Такие операторы получили название подзапросов или вложенных запросов.

 

Подзапросы могут быть помещены после операторов сравнения

(=, <, >, <=, >=, <>)

в предложениях WHERE и HAVING внешнего оператора SELECT.

 

Таким образом, подзапрос – это ключ доступа в предложениях WHERE и HAVING, инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором SELECT.

Подзапросымогут также применяться в операторах

· INSERT,

· UPDATE,

· DELETE.

 

К подзапросам применяются следующие правила и ограничения:

1. В подзапросе фраза ORDER BYне используется, но она может присутствовать во внешнем запросе.

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

3. По умолчанию имена столбцов в подзапросе относятся к таблице, имя которой указано в предложении FROMподзапроса.

Однако допускается ссылка и на столбцы таблицы, указанной в предложении FROMвнешнего запроса, но при этом имена столбцов нужно указывать с именем таблицы.

4. Если подзапрос является одним из операндов в операции сравнения, то он должен указываться в правой части этой операции.

 

 

Существуют два типа подзапросов:

· Скалярный подзапрос, который возвращает единственное значение. Он может использоваться везде, где требуется указать единственное значение.

· Табличный подзапрос, который возвращает множество значений, то есть значения из одного или нескольких столбцов таблицы, и эти значения размещаются в нескольких строках. Он может использоваться везде, где допускается наличие таблицы.