Создание запросов в СУБД Access
Рефераты >> Программирование и компьютеры >> Создание запросов в СУБД Access

Кроме механизма соединений в SQL есть механизм вложенных подзапросов, позволяющий объединить несколько простых запросов в едином предложении SELECT. Иными словами, вложенный подзапрос - это уже знакомый нам подзапрос (с небольшими огра-ничениями), который вложен в WHERE фразу другого вложенного подзапроса или WHERE фразу основного запроса.

Для иллюстрации вложенного подзапроса вернемся к предыдущему примеру и попробуем получить перечень тех поставщиков продуктов для Сырников, которые поставляют нужные продукты за минимальную цену. SELECT Продукт, Цена, Название, СтатусFROM Продукты, Состав, Блюда, Поставки, ПоставщикиWHERE Продукты.ПР = Состав.ПРAND Состав.БЛ = Блюда.БЛAND Поставки.ПР = Состав.ПРAND Поставки.ПС = Поставщики.ПСAND Блюдо = 'Сырники'AND Цена = ( SELECT MIN(Цена) FROM Поставки X WHERE X.ПР = Поставки.ПР );

Результат запроса имеет вид

Продукт

Цена

Название

Статус

Яйца

1.8

ПОРТОС

кооператив

Сахар

0.94

ТУЛЬСКИЙ

универсам

Мука

0.5

УРОЖАЙ

коопторг

Сметана

2.2

ОГУРЕЧИК

ферма

Творог

1.

ОГУРЕЧИК

ферма

Здесь с помощью подзапроса, размещенного в трех последних строках запроса, описывается процесс определения минимальной цены каждого продукта для Сырников и поиск поставщика, предлагающего этот продукт за такую цену. Механизм реализации подзапросов будет подробно описан в п.3.3. Там же будет рассмотрено, как и для чего вводится псевдоним X для имени таблицы Поставки.3.2. Запросы, использующие соединения

3.2.1. Декартово произведение таблиц

В литературе [2] показано, что соединения - это подмножества декартова произведения. Так как декартово произведение n таблиц - это таблица, содержащая все возможные строки r, такие, что r является сцеплением какой-либо строки из первой таблицы, строки из второй таблицы, . и строки из n-й таблицы (а мы уже научились выделять с помощью SELECT любое подмножество реляционной таблицы), то осталось лишь выяснить, можно ли с помощью SELECT получить декартово произведение. Для получения декартова произведения нескольких таблиц надо указать во фразе FROM перечень перемножаемых таблиц, а во фразе SELECT – все их столбцы.

Так, для получения декартова произведения Вид_блюд и Трапезы надо выдать запрос SELECT Вид_блюд.*, Трапезы.*FROM Вид_блюд, Трапезы;

Получим таблицу, содержащую 5 х 3 = 15 строк:

В

Вид

Т

Трапеза

З

Закуска

1

Завтрак

З

Закуска

2

Обед

З

Закуска

3

Ужин

С

Суп

1

Завтрак

С

Суп

2

Обед

С

Суп

3

Ужин

Г

Горячее

1

Завтрак

Г

Горячее

2

Обед

Г

Горячее

3

Ужин

Д

Десерт

1

Завтрак

Д

Десерт

2

Обед

Д

Десерт

3

Ужин

Н

Напиток

1

Завтрак

Н

Напиток

2

Обед

Н

Напиток

3

Ужин

В другом примере, где перемножаются таблицы Меню, Трапезы, Вид_блюд, Блюда: SELECT Меню.*, Трапезы.*, Вид_блюд.*, Блюда.*FROM Меню, Трапезы, Вид_блюд, Блюда;

образуется таблица (рис 3.1), содержащая 21 х 3 х 5 х 33 = 10395 строк.

Из первых 39 строк этой таблицы лишь две актуальных (отмечены "*"): в них совпадают номера блюд таблиц Меню и Блюда. В остальных – полная чепуха: к закускам отнесены супы и напитки, на завтрак предлагается незапланированный суп и т.д.  

3.2.2. Эквисоединение таблиц

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

Меню

Трапезы

Вид_блюд

Блюда

Т

В

БЛ

Т

Трапеза

В

Вид

БЛ

Блюдо

В

Основа

Выход

Труд

1

З

3

1

Завтрак

З

Закуска

1

Салат летний

З

Овощи

200.

3

1

З

3

1

Завтрак

З

Закуска

2

Салат мясной

З

Мясо

200.

4

1

З

3

1

Завтрак

З

Закуска

3

Салат витаминный

З

Овощи

200.

4 *

. . .

1

З

3

1

Завтрак

З

Закуска

12

Суп молочный

С

Молоко

500.

3

1

З

3

1

Завтрак

З

Закуска

13

Бастурма

Г

Мясо

300.

5

. . .

1

З

3

1

Завтрак

З

Закуска

32

Кофе черный

Н

Кофе

100.

1

1

З

3

1

Завтрак

З

Закуска

33

Кофе на молоке

Н

Кофе

200.

2

1

З

6

1

Завтрак

З

Закуска

1

Салат летний

З

Овощи

200.

3

1

З

6

1

Завтрак

З

Закуска

2

Салат мясной

З

Мясо

200.

4

1

З

6

1

Завтрак

З

Закуска

3

Салат витаминный

З

Овощи

200.

4

1

З

6

1

Завтрак

З

Закуска

4

Салат рыбный

З

Рыба

200.

4

1

З

6

1

Завтрак

З

Закуска

5

Паштет из рыбы

З

Рыба

120.

5

1

З

6

1

Завтрак

З

Закуска

6

Мясо с гарниром

З

Мясо

250.

3 *

. . .


Страница: