Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Конспект (Архитектуры обработки данных + SQL).doc
Скачиваний:
74
Добавлен:
10.12.2013
Размер:
336.9 Кб
Скачать
    1. Вложенные запросы

      1. Исходная база данных

Эта база данных далее будет использоваться в примерах.

Таблица Клиент

IDN

IDN_ГОРОДА

ИМЯ

РЕКВИЗИТЫ

IDN_БАНКА

204

101

Петров

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

311

205

104

Кузнецов

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

314

206

102

Иванов

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

317

208

104

Золин

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

311

210

105

Киров

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

323

212

103

Павлов

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

317

215

105

Петренко

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

318

Таблица Города

IDN

НАЗВАНИЕ

102

Минск

101

Москва

103

Саратов

104

Пермь

105

Киев

Таблица Банки

IDN

РЕКВИЗИТЫ

311

МММ

314

Альфа – банк

317

Сбербанк

323

Менатеп

318

Западуралбанк

Таблица Перемещение

IDN

ПОРЯДКОВ№

КОД_ДОК

ДАТА_ДОК

НОМЕР_ДОК

IDN_

ГРУППЫ

IDN_

МАТ.ЦЕН

КОЛ-ВО

ЦЕНА

402

501

20

402

503

25

404

505

6

.

404

504

7

404

506

5

406

508

15

406

507

25

Некоторые столбцы не заполнены т.к. не используются в примерах.

Таблица Группы

IDN

НАЗВАНИЕ

402

Газ. вода

404

Шоколад

406

Сигареты

Таблица Мат. ценности

IDN_ГРУППЫ

IDN_МАТ.ЦЕН

IDN_МАТ.ЦЕН

402

501

Fanta

402

503

Sprite

404

505

Mars

404

504

Twix

404

506

Шок

406

508

Кама

406

507

L&M

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

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 Группы Г, МАТ.ЦЕННОСТИ М, ПЕРЕМЕЩЕНИЕ П

WHERE М.IDN_ГРУППЫ = П.IDN_ГРУППЫ

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

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

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

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

Соседние файлы в папке Программирование