3.2. Запросы, использующие соединения
3.2.1. Декартово произведение таблиц
В литературе [2] показано, что соединения - это подмножества декартова произведения. Так как декартово произведение 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 Меню, Трапезы, Вид_блюд, Блюда;
образуется таблица (рис 3.1), содержащая 21 х 3 х 5 х 33 = 10395 строк.
Из первых 39 строк этой таблицы лишь две актуальных (отмечены "*"): в них совпадают номера блюд таблиц Меню и Блюда. В остальных – полная чепуха: к закускам отнесены супы и напитки, на завтрак предлагается незапланированный суп и т.д.
3.1 | Содержание | 3.2.2