Создание запросов в СУБД 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 строк:
В другом примере, где перемножаются таблицы Меню, Трапезы, Вид_блюд, Блюда: 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 * |
. . . |