Организация 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 *

. . .


Страница: