Организация Web-доступа к базам данных с использованием SQL-запросовРефераты >> Программирование и компьютеры >> Организация Web-доступа к базам данных с использованием SQL-запросов
Кроме механизма соединений в 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. |
ОГУРЕЧИК |
Ферма |
Здесь с помощью подзапроса, размещенного в трех последних строках запроса, описывается процесс определения минимальной цены каждого продукта для Сырников и поиск поставщика, предлагающего этот продукт за такую цену.
Запросы, использующие соединения
Декартово произведение таблиц
Так как декартово произведение 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 Меню, Трапезы, Вид_блюд, Блюда;
образуется таблица (рис 2.6), содержащая 21 х 3 х 5 х 33 = 10395 строк.
Эквисоединение таблиц
Если из декартова произведения убрать ненужные строки и столбцы, то можно получить актуальные таблицы, соответствующие любому из соединений.
Меню |
Трапезы |
Вид_блюд |
Блюда | |||||||||
Т |
В |
БЛ |
Т |
Трапеза |
В |
Вид |
БЛ |
Блюдо |
В |
Основа |
Выход |
Труд |
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 * |
. . . |