Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД7.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
38.06 Кб
Скачать
  1. Использование подзапросов

Часто не возможно решить задачу путем использования единственного запроса Select/Например в тех случаях когда при использования условия поиска

Where <сравниваемое значение> <оператор> < значение, с которым сравнивать>

Параметр <значение с которым сравнивать> заранее не определен и должен вычисляться в момент выполнения оператора select, или представляет собой не одно а несколько значений, в этом случае применяются под запросы:

Select …

From…

Where <сравниваемое значение> <оператор> (select….)

Обязательно в круглых скобках

Вложенный оператор также может содержать внутри вложенные запросы

#Выдать дату, на которую приходится максимальный отпуск товара

Таблица Rashod

Select date_R, kolvo_R

from Rashod

Where kolvo_R = (Select max(kolvo_R from Rashod))

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

Таблицы Pocupateli (P) и Rashod(R) связаны полем ID_pocup

Select R.date_R,R.kolvo_R, P.* from Rashod R, Pocupateli P //псевдоним

Where R.ID_pocup=P.ID_pocup

and (R.kolvo_R =(Select max(Kolvo_R) from Rashod)

ЗАМЕЧАНИЕ Часто ошибкой является применение вложенного оператора select, который вместо единственного значения множество значений.

#Покупателей из ИРКУТСКА может быть много

SELECT R.data_R, R.Tovarname,R.kolvo_R, P.*

FROM Rashod R, Pocupateli P

WHERE R.ID_pocup=P.ID_pocup

And R.ID_pocup= (Select P.ID_pocup from Pocupateli P where Upper (P.Gorod)=’ИРКУТСК’)

#ИСПРАВЛЕНО

SELECT R.data_R, R.Tovarname,R.kolvo_R, P.*

FROM Rashod R, Pocupateli P

WHERE R.ID_pocup=P.ID_pocup

And R.ID_pocup in (Select P.ID_pocup from Pocupateli P where Upper (P.Gorod) ’ИРКУТСК’)

  1. Вложение подзапросов

# Составить список отгрузки товаров покупателю, который преобрел максимальную партию какого-либо товара

Select R1.* from Rashod R1

Where R1.pocup_name in

(select R2.pocup_name from Rashod R2

Where R2.kolvo = (select max(R3.kolvo) from Rashod R3))

  1. Дополнительные возможности использования подзапросов, возвращающих единственное значение

    1. Использование Exist (существование)

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

Exist (подзапрос)

#Выдать список всех покупателей, которые хотя бы один раз получали товар со склада.

Select P.pokup_name from pokupateli P

Where exist (select R.pokup_name from Rashod R

Where P.pokup_name= R.pokup_name)//если существует запись об этом объекте в др таблице

    1. Использование Singular (единственный)

Если в условии поиска необходимо указать, что из таблицы выбираются только те записи, для которых подзапрос возвращает только 1 значение, используется предложение

Singular (подзапрос)

#Составить список покупателей купивших только 1 товар

Информация о покупках хранится в таблице Rashod

Select P.pokup_name from pokupateli P

Where Singular (select R.pokup_name from Rashod R

Where P.pokup_name= R.pokup_name)

  1. Использование подзапросов возвращающих множество значений

    1. Использование All или some=any

Если в условии поиска нужно , чтобы сравниваемое значение находилось в определенном отношении со всеми или некоторыми значениями из множества значений, возвращаемых подзапосом, применяют предложение

<сравниваемое значение> [NOT] <оператор> {ALL|SOME|ANY} (<подзапрос>)

Отношение сравниваемого значения и значений, возвращаемых подзапросом устанавливается словами:

  • ALL – указывает, что условие поиска истинно только тогда, когда сравниваемое значение находится в нужном отношении со всеми значениями, возвращаемыми подзапросом.

  • SOME(ANY) – условие поиска истинно, когда сравниваемое значение находится в нужном отношении хотя бы с одним значением, возвращаемым подзапросом.

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

Select R1.* from Rashod R1

Where R1.kolvo > ALL

(select R2.kolvo, R2.pokup_name from Rashod R2,

Group by R2.pokup_name)

#Перечислить все факты отгрузки товаров со склада, в которых количество превышает среднее отгрузки, хотя бы одного товара

Select R1.* from Rashod R1

Where R1.kolvo > ANY

(select R2.kolvo, R2.pokup_name from Rashod R2,

Group by R2.pokup_name)