Организация Web-доступа к базам данных с использованием SQL-запросов

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

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З31ЗавтракЗЗакуска1Салат летнийЗОвощи200.3 1З31ЗавтракЗЗакуска2Салат мяснойЗМясо200.4 1З31ЗавтракЗЗакуска3Салат витаминныйЗОвощи200.4 *. . .1З31ЗавтракЗЗакуска12Суп молочныйСМолоко500.3 1З31ЗавтракЗЗакуска13БастурмаГМясо300.5 . . .1З31ЗавтракЗЗакуска32Кофе черныйНКофе100.1 1З31ЗавтракЗЗакуска33Кофе на молокеНКофе200.2 1З61ЗавтракЗЗакуска1Салат летнийЗОвощи200.3 1З61ЗавтракЗЗакуска2Салат мяснойЗМясо200.4 1З61ЗавтракЗЗакуска3Салат витаминныйЗОвощи200.4 1З61ЗавтракЗЗакуска4Салат рыбныйЗРыба200.4 1З61ЗавтракЗЗакуска5Паштет из рыбыЗРыба120.5 1З61ЗавтракЗЗакуска6Мясо с гарниромЗМясо250.3 *. . .Рисунок 2.6

Очевидно, что отбор актуальных строк обеспечивается вводом в запрос WHERE фразы, в которой устанавливается соответствие между:

  • кодами трапез (Т) в таблицах Меню и Трапезы (Меню.Т = Трапезы.Т),
  • кодами видов блюд (В) в таблицах Меню и Вид_блюд (Меню.В = Вид_блюд.В),
  • номерами блюд (БЛ) в таблицах Меню и Блюда (Меню.БЛ = Блюда.БЛ).

Такой скорректированный запрос

 

SELECTМеню.*, Трапезы.*, Вид_блюд.*, Блюда.*

FROMМеню, Трапезы, Вид_блюд, Блюда

WHEREМеню.Т = Трапезы.Т

ANDМеню.В = Вид_блюд.В

ANDМеню.БЛ = Блюда.БЛ;

позволит получить эквисоединение таблиц Меню, Трапезы, Вид_блюд и Блюда:

ТВБЛТТрапезаВВидБЛБлюдоВОсноваВыходТруд1З31ЗавтракЗЗакуска3Салат витаминныйЗОвощи200.41З61ЗавтракЗЗакуска6Мясо с гарниромЗМясо250.31Г191ЗавтракГГорячее19Омлет с лукомГЯйца200.5. . .3Г163УжинГГорячее16ДраченаГЯйца180.43Н303УжинННапиток30КомпотНФрукты200.23Н313УжинННапиток31Молочный напитокНМолоко200.2

 

 

Естественное соединение таблиц

Легко заметить, что в эквисоединение таблиц вошли дубликаты столбцов, по которым проводилось соединение (Т, В и БЛ). Для исключения этих дубликатов можно создать естественное соединение тех же таблиц:

 

SELECTТ, В, БЛ, Трапеза, Вид, Блюдо, Основа, Выход, Труд

FROMМеню, Трапезы, Вид_блюд, Блюда

WHEREМеню.Т = Трапезы.Т

ANDМеню.В = Вид_блюд.В

ANDМеню.БЛ = Блюда.БЛ;

Реализация естественного соединения таблиц имеет вид

 

ТВБЛТрапезаВидБлюдоОсноваВыходТруд1З3ЗавтракЗакускаСалат витаминныйОвощи200.41З6ЗавтракЗакускаМясо с гарниромМясо250.31Г19ЗавтракГорячееОмлет с лукомЯйца200.53Г16УжинГорячееДраченаЯйца180.43Н30УжинНапитокКомпотФрукты200.23Н31УжинНапитокМолочный напитокМолоко200.2

 

Композиция таблиц

Для исключения всех столбцов, по которым проводится соединение таблиц, надо создать композицию

 

SELECTТрапеза, Вид, Блюдо, Основа, Выход, Труд

FROMМеню, Трапезы, Вид_блюд, Блюда

WHEREМеню.Т = Трапезы.Т

ANDМеню.В = Вид_блюд.В

ANDМеню.БЛ = Блюда.БЛ;

имеющую вид

ТрапезаБлюдоВидОсноваВыходТрудЗавтракСалат витаминныйЗакускаОвощи200.4ЗавтракМясо с гарниромЗакускаМясо250.3ЗавтракОмлет с лукомГорячееЯйца200.5. . .УжинДраченаГорячееЯйца180.4УжинКомпотНапитокФрукты200.2УжинМолочный напитокНапитокМолоко200.2

 

Тета-соединение таблиц

В базе данных ПАНСИОН трудно подобрать несложный пример, иллюстрирующий тета-соединение таблиц. Поэтому сконструируем такой надуманный запрос:

 

SELECTВид_блюд.*, Трапезы.*

FROMВид_блюд, Трапезы

WHEREВид Трапеза;

позволяющий выбрать из полученного декартова произведения таблиц Вид_блюд и Трапезы лишь те строки, в которых значение трапезы меньше (по алфавиту) значения вида блюда:

ВВидТТрапезаЗЗакуска1ЗавтракССуп1ЗавтракССуп2ОбедННапиток1Завтрак

 

Соединение таблиц с дополнительным условием

При формировании соединения создается рабочая таблица, к которой применимы все операции: отбор нужных строк соединения (WHERE фраза), упорядочение получаемого результата (ORDER BY фраза) и агрегатирование данных (SQL-функции и GROUP BY фраза).

Например, для получения перечня блюд, предлагаемых в меню на завтрак, можно сформировать запрос на основе композиции:

 

SELECTВид, Блюдо, Основа, Выход, Номер , БЛ

FROMМеню, Трапезы, Вид_блюд, Блюда

WHEREМеню.Т = Трапезы.Т

ANDМеню.В = Вид_блюд.В

ANDМеню.БЛ = Блюда.БЛ

ANDТрапеза = Завтрак;

 

ВидБлюдоОсноваВыходНомер БЛЗакускаСалат витаминныйОвощи200.Номер -3ЗакускаМясо с гарниромМясо250.Номер -6ГорячееОмлет с лукомЯйца200.Номер -19ГорячееПудинг рисовыйКрупа160.Номер -21НапитокМолочный напитокМолоко200.Номер -31Нап?/p>