Эквисоединение таблиц
Если из декартова произведения убрать ненужные строки и столбцы, то можно получить актуальные таблицы, соответствующие любому из соединений.
Меню | Трапезы | Вид_блюд | Блюда | ||||||||||||||||||||||||||||
Т | В | БЛ | Т | Трапеза | В | Вид | БЛ | Блюдо | В | Основа | Выход | Труд | |||||||||||||||||||
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 * | |||||||||||||||||||
. . . |
Очевидно, что отбор актуальных строк обеспечивается вводом в запрос WHERE фразы, в которой устанавливается соответствие между:
· кодами трапез (Т) в таблицах Меню и Трапезы (Меню.Т = Трапезы.Т),
· кодами видов блюд (В) в таблицах Меню и Вид_блюд (Меню.В = Вид_блюд.В),
· номерами блюд (БЛ) в таблицах Меню и Блюда (Меню.БЛ = Блюда.БЛ).
Такой скорректированный запрос
SELECT Меню.*, Трапезы.*, Вид_блюд.*, Блюда.*
FROM Меню, Трапезы, Вид_блюд, Блюда
WHERE Меню.Т = Трапезы.Т
AND Меню.В = Вид_блюд.В
AND Меню.БЛ = Блюда.БЛ;
позволит получить эквисоединение таблиц Меню, Трапезы, Вид_блюд и Блюда:
Т | В | БЛ | Т | Трапеза | В | Вид | БЛ | Блюдо | В | Основа | Выход | Труд | |||||||||||
1 | З | 3 | 1 | Завтрак | З | Закуска | 3 | Салат витаминный | З | Овощи | 200. | 4 | |||||||||||
1 | З | 6 | 1 | Завтрак | З | Закуска | 6 | Мясо с гарниром | З | Мясо | 250. | 3 | |||||||||||
1 | Г | 19 | 1 | Завтрак | Г | Горячее | 19 | Омлет с луком | Г | Яйца | 200. | 5 | |||||||||||
. . . | |||||||||||||||||||||||
3 | Г | 16 | 3 | Ужин | Г | Горячее | 16 | Драчена | Г | Яйца | 180. | 4 | |||||||||||
3 | Н | 30 | 3 | Ужин | Н | Напиток | 30 | Компот | Н | Фрукты | 200. | 2 | |||||||||||
3 | Н | 31 | 3 | Ужин | Н | Напиток | 31 | Молочный напиток | Н | Молоко | 200. | 2 |
Естественное соединение таблиц
Легко заметить, что в эквисоединение таблиц вошли дубликаты столбцов, по которым проводилось соединение (Т, В и БЛ). Для исключения этих дубликатов можно создать естественное соединение тех же таблиц:
SELECT Т, В, БЛ, Трапеза, Вид, Блюдо, Основа, Выход, Труд
FROM Меню, Трапезы, Вид_блюд, Блюда
WHERE Меню.Т = Трапезы.Т
AND Меню.В = Вид_блюд.В
AND Меню.БЛ = Блюда.БЛ;
Реализация естественного соединения таблиц имеет вид
Т | В | БЛ | Трапеза | Вид | Блюдо | Основа | Выход | Труд | |||||||
1 | З | 3 | Завтрак | Закуска | Салат витаминный | Овощи | 200. | 4 | |||||||
1 | З | 6 | Завтрак | Закуска | Мясо с гарниром | Мясо | 250. | 3 | |||||||
1 | Г | 19 | Завтрак | Горячее | Омлет с луком | Яйца | 200. | 5 | |||||||
… | |||||||||||||||
3 | Г | 16 | Ужин | Горячее | Драчена | Яйца | 180. | 4 | |||||||
3 | Н | 30 | Ужин | Напиток | Компот | Фрукты | 200. | 2 | |||||||
3 | Н | 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 Трапеза = ’Завтрак’;