Вообще, соединения - это подмножества декартова произведения. Так как декартово произведение n таблиц - это таблица, содержащая все возможные строки r, такие, что r является сцеплением какой-либо строки из первой таблицы, строки из второй таблицы, ... и строки из n-й таблицы (а мы уже научились выделять с помощью SELECT любое подмножество реляционной таблицы), то осталось лишь выяснить, можно ли с помощью SELECT получить декартово произведение. Для получения декартова произведения нескольких таблиц, надо указать в предложении FROM перечень перемножаемых таблиц, а в предложении SELECT – все их столбцы.
Пример 17.
Предположим нам необходимо получить состав продуктов для каждого блюда.
Информация для этого запроса хранится в таблицах Блюда, Состав и Продукты. Для получения декартова произведения таблиц Блюда(n-строк), Состав (m-строк) и Продукты (k - строк) надо написать запрос
SELECT Блюда.*, Состав.*, Продукты.*
FROM Блюда, Состав, Продукты;
Получим таблицу, содержащую (n × m × k) строк:
ID_блюда
Блюдо
Вид
Основа
Вес
Труд
Блюдо
Продукт
Вес
ID_продукта
Продукт
Белки
Жиры
Углеводы
К
Са
Na
B2
PP
C
Салат летний
Овощи
Говядина
NULL
1,5
Салат летний
Овощи
Говядина
NULL
1,5
Салат летний
Овощи
Говядина
NULL
1,5
Салат летний
Овощи
Говядина
NULL
1,5
…
Результат далек от нужного, так как содержит лишние строки. Если из декартова произведения убрать ненужные строки и столбцы, то можно получить актуальные таблицы, соответствующие операций соединение.
Очевидно, что отбор актуальных строк обеспечивается вводом в запрос фразы WHERE, в которой устанавливается соответствие между кодами блюд в таблицах Блюда и Состав (Блюда.ID_Блюда = Состав.Блюдо) и кодами продуктов в таблицах Состав и Продукты (Состав.Продукт = Продукты.ID_Продукта).