Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 8 - Вложенные запросы.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
49.87 Кб
Скачать

11

Лекция 5 Вложенные запросы

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

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

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

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

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

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

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

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

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

  • INSERT,

  • UPDATE,

  • DELETE.

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

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

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

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

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

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

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

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

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

Скалярные подзапросы

Пример 1. Определить дату продажи максимальной партии товара.

Declare @a nchar(50);

Select @a='Дата поставки максимальной партии товара’;

Select @a;

SELECT Дата, Количество_ед_товара

FROM Продажи

WHERE Количество_ед_товара =

(SELECT Max(Количество_ед_товара) FROM Продажи)

Отметим, что здесь нельзя прямо использовать предложение

WHERE Количество_ед_товара = Max(Количество_ед_товара),

так как просто использовать агрегирующие функции в предложении WHERE запрещено.

Пример 2. Определить даты продаж, в которых количество проданного товара превышало среднее значение от всего проданного товара.

Для этих сделок указать превышение над средним значением.

SELECT Дата, Количество_ед_товара,

(Количество_ед_товара – (SELECT Avg(Количество_ед_товара))

FROM Продажи) AS Превышение

FROM Продажи

WHERE Количество_ед_товара >

(SELECT AVG(Количество_ед_товара) FROM Продажи)

Либо тот же самый запрос в другом варианте:

Declare @a int;

Select @a=(SELECT AVG(Количество_ед_товара) FROM Продажи);

Select @a;

SELECT Дата, Количество_ед_товара,

(Количество_ед_товара – (@a AS Превышение

FROM Продажи

WHERE Количество_ед_товара > @a

Пример 3. Вывести клиентов, совершивших сделки с максимальным количеством товара.

SELECT Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество

FROM Клиенты INNER JOIN Продажи

ON Клиенты.ID_Клиента = Продажи.Клиент

WHERE Продажи. Количество_ед_товара =

(SELECT Max(Количество_ед_товара)) FROM Продажи)

Пример 4. Вывести список покупателей, в сделках которых количество товара отличается от максимального не более чем на 10%.

SELECT Клиенты.Фамилия, Продажи.Количество_ед_товара

FROM Клиенты INNER JOIN Продажи

ON Клиенты.ID_Клиента = Продажи.Клиент

WHERE Продажи. Количество_ед_товара >

0.9* (SELECT Max(Количество_ед_товара)) FROM Продажи)

Покажем, как применяются подзапросы в предложении HAVING

Пример 5. Определить даты, когда среднее количество проданного товара за день оказалось больше 1000 единиц.

SELECT Дата, AVG(Количество_ед_товара) AS ‘Среднее’

FROM Продажи

GROUP BY Дата

HAVING AVG(Продажи. Количество_ед_товара)>1000

Напомним, что при помощи HAVING отражаются все предварительно сгруппированные посредством GROUP BY блоки данных, удовлетворяющие заданным в HAVING условиям.

В приведенном запросе за каждый день определяется среднее количество товара, которое сравнивается с числом 20.

Пример 6. Определить даты, когда среднее количество проданного товара за день оказалось больше среднего показателя по всем сделкам вообще.

SELECT Дата, Avg(Продажи. Количество_ед_товара)) AS Среднее

FROM Продажи

GROUP BY Дата

HAVING

Avg(Количество_ед_товара)) > (SELECT Avg(Количество_ед_товара) FROM Продажи)

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

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