Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_Informatsionnoe_obesp_SU.doc
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
446.46 Кб
Скачать

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

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

Предположим, необходимо извлечь всю информацию о банке с которым

работает Киров.

Вот один из способов решения:

SELECT * FROM БАНКИ

WHERE IDN =(SELECT IDN_БАНКА FROM КЛИЕНТ WHERE ИМЯ=‘Киров’)

Выходные данные:

IDN

РЕКВИЗИТЫ

323

Менатеп

Чтобы оценить основной запрос, SQL должен оценить внутренний запрос ( или подзапрос) в предложении WHERE . Подзапрос оценивается так как если бы он был основным запросом: просматриваются все строки таблицы Клиент и выбираются те строки , для которых значение поля имя равно Киров, для таких строк выбираются значения поля IDN_БАНКА.

В результате выбранной оказывается строка с IDN_БАНКА = 323 . SQL подставляет его в предикат основного запроса вместо подзапроса, теперь предикат читается следующим образом:

WHERE IDN =323

После этого основной запрос выполняется как обычный, его результат показан

выше.

Если указать просто:

WHERE IDN =323

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

делает процедуру более гибкой .

В следующем примере использование подзапроса обязательно.

Получить все банки, которые не используются клиентами:

SELECT * FROM Банки

WHERE

(SELECT COUNT(*) FROM Клиент WHERE Клиент.Idn_банка = Банки.Idn) = 0

Еще один пример, когда необходимо использовать подзапрос:

Для каждой группы товаров найти товар с минимальной ценой, вывести название группы, название товара, цену:

SELECT Г.НАЗВАНИЕ, М НАЗВАНИЕ, П.ЦЕНА

FROM Группы Г, МАТ.ЦЕННОСТИ М, ПЕРЕМЕЩЕНИЕ П

W HERE М.IDN_ГРУППЫ = П.IDN_ГРУППЫ

AND М.IDN_МАТ.ЦЕН. = П.IDN_МАТ.ЦЕН.

AND Г.IDN = П.IDN_ГРУППЫ

AND П.ЦЕНА = (SELECT MIN (ЦЕНА) FROM Перемещение ПВНУТР

W HERE П.IDN_ГРУППЫ = ПВНУТР.IDN_ГРУППЫ )

6.4.3Оператор exists

EXISTS ( существует )  оператор, генерирующий значения «истина» или «ложь». Его мoжно применять отдельно в предикате или комбинировать с другими выражениями с помощью операторов AND, OR, NOT .Этот оператор оценивает подзапрос как истинный, если подзапрос генерирует выходные данные, а в противном случае как ложный, иными словами оператор EXISTS возвращает значение «истина», если подзапрос возвращает хотя бы одну строку. В отличие от прочих операторов и предикатов, он не может принимать значения unknown (неизвестный). Например, нужно извлечь данные из таблицы Клиент в том случае, если один (или более) клиент из нее работает с банком МММ:

SELECT * FROM КЛИЕНТ

WHERE EXISTS

(SELECT * FROM КЛИЕНТ WHERE IDN_банка = 311)

Выходные данные:

IDN

IDN_ГОРОДА

ИМЯ

РЕКВИЗИТЫ

IDN_БАНКА

204

101

Петров

--------------

311

205

104

Кузнецов

--------------

314

206

102

Иванов

--------------

317

208

104

Золин

--------------

311

210

105

Киров

--------------

323

212

103

Павлов

--------------

317

215

105

Петренко

--------------

318

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

Т.к. такие клиенты существуют , оператор EXISTS отметил, что подзапрос генерирует выходные данные, и принимает значение «истина». В данном случае тот же результат можно было получить проще, однако, бывают случаи, когда без EXISTS не обойтись.

Вывести название группы, если в ней есть товар, цена которого > 20.

SELECT ГРУППЫ.НАЗВАНИЕ

FROM ГРУППЫ

WHERE EXISTS

( SELECT ЦЕНА FROM ПЕРЕМЕЩЕНИЕ

WHERE ЦЕНА> 20

AND ГРУППЫ.IDN = ПЕРЕМЕЩЕНИЕ.IDN_ ГРУППЫ)

Oператор EXISTS отметил ,что подзапрос генерирует выходные данные, и принимает значение «истина» для групп газ. вода и сигареты.

Выходные данные:

НАЗВАНИЕ

Газ. вода

Сигареты

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

Получить все банки, которые не используются клиентами:

SELECT * FROM Банки

WHERE NOT EXISTS

(SELECT * FROM Клиент WHERE Клиент.Idn_банка = Банки.Idn)

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