Организация 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.5…3Г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>