Организация Web-доступа к базам данных с использованием SQL-запросов
| | | | |мясн| | | | |
| | | | | | | | |ой | | | | |
|1 |З |6 |1 |Завт|З |Заку|3 |Сала|З |Овощ|200.|4 |
| | | | |рак | |ска | |т | |и | | |
| | | | | | | | |вита| | | | |
| | | | | | | | |минн| | | | |
| | | | | | | | |ый | | | | |
|1 |З |6 |1 |Завт|З |Заку|4 |Сала|З |Рыба|200.|4 |
| | | | |рак | |ска | |т | | | | |
| | | | | | | | |рыбн| | | | |
| | | | | | | | |ый | | | | |
|1 |З |6 |1 |Завт|З |Заку|5 |Пашт|З |Рыба|120.|5 |
| | | | |рак | |ска | |ет | | | | |
| | | | | | | | |из | | | | |
| | | | | | | | |рыбы| | | | |
|1 |З |6 |1 |Завт|З |Заку|6 |Мясо|З |Мясо|250.|3 * |
| | | | |рак | |ска | |с | | | | |
| | | | | | | | |гарн| | | | |
| | | | | | | | |иром| | | | |
|. . | | | | | | | | | | | | |
|. | | | | | | | | | | | | |
Рисунок 2.6
Очевидно, что отбор актуальных строк обеспечивается вводом в запрос 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 Трапеза = ’Завтрак’;
|Вид |Блюдо |Основа |Выхо|'Номе|БЛ |
| | | |д |р –' | |
|Закуск|Салат |Овощи |200.|Номер|3 |
|а |витаминны| | |- | |
| |й | | | | |
|Закуск|Мясо с |Мясо |250.|Номер|6 |
|а |гарниром | | |- | |
|Горяче|Омлет с |Яйца |200.|Номер|19 |
|е |луком | | |- | |
|Горяче|Пудинг |Крупа |160.|Номер|21 |
|е |рисовый | | |- | |
|Напито|Молочный |Молоко |200.|Номер|31 |
|к |напиток | | |- | |
|Напито|Кофе |Кофе |100.|Номер|32 |
|к |черный | | |- | |
Соединение таблицы со своей копией
В ряде приложений возникает необходимость одновременной обработки
данных какой-либо таблицы и одной или нескольких ее копий, создаваемых на
время выполнения запроса.
Например, при создании списков студентов (таблица Студенты) возможен
повторный ввод данных о каком-либо студенте с присвоением ему второго
номера зачетной книжки. Для выявления таких ошибок можно соединить таблицу
Студенты с ее временной копией, установив в WHERE фразе равенство значений
всех одноименных столбцов этих таблиц кроме столбцов с номером зачетной
книжки (для последних надо установить условие неравенства значений).
Временную копию таблицы можно сформировать, указав имя псевдонима за
именем таблицы во фразе FROM. Так, с помощью фразы
FROM Блюда X, Блюда Y, Блюда Z
будут сформированы три копии таблицы Блюда с именами X, Y и Z.
В качестве примера соединения таблицы с ней самой сформируем запрос на
вывод таких пар блюд таблицы Блюда, в которых совпадает основа, а название
первого блюда пары меньше (по алфавиту), чем номер второго блюда пары. Для
этого можно создать запрос с одной копией таблицы Блюда (Копия):
SELECT Блюдо, Копия.Блюдо, Основа
FROM Блюда, Блюда Копия
WHERE Основа = Копия.Основа
AND Блюдо < Копия.Блюдо;
или двумя ее копиями (Первая и Вторая):
SELECT Первая.Блюдо, Вторая.Блюдо, Основа
FROM Блюда Перв
| | скачать работу |
Организация Web-доступа к базам данных с использованием SQL-запросов |