Организация Web-доступа к базам данных с использованием SQL-запросов
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
люда блюдо с первичным ключом БЛ = 1 и в таблице Продукты продукт с первичным ключом ПР = 10. Отсутствие любого из этих значений породит противоречие: в базе появится ссылка на несуществующую запись. Проблемы, возникающие при использовании внешних ключей, подробно рассмотрены в литературе, а здесь отме-тим, что все приличные СУБД имеют механизмы для предотв-ращения ввода записей со значениями внешних ключей, отсутст-вующих среди значений соответствующих первичных ключей.
Вставка множества записей
Создать временную таблицу К_меню, содержащую калорийность и стоимость всех блюд, которые можно приготовить из имеющихся продуктов. (Эта таблица будет использоваться шеф-поваром для составления меню на следующий день.)
Для создания описания временной таблицы можно, например, воспользоваться предложением CREATE TABLE
CREATE TABLE К_меню
(ВидCHAR (10),
БлюдоCHAR (60),
Калор_блюдаINTEGER,
Стоим_блюдаREAL);
а для ее загрузки данными предложение INSERT с вложенным подзапросами:
INSERT
INTOК_меню
SELECTВид, Блюдо,
INT(SUM(((Белки+Углев)*4.1+Жиры*9.3) * Вес/1000)),
(SUM(Стоимость/К_во*Вес/1000) + MIN(Труд/100))
FROMБлюда, Вид_блюд, Состав, Продукты, Наличие
WHEREБлюда.БЛ= Состав.БЛ
ANDСостав.ПР= Продукты.ПР
ANDСостав.ПР= Наличие.ПР
ANDБлюда.В= Вид_блюд.В
ANDБЛ NOT IN
(SELECTБЛ
FROMСостав
WHEREПР IN
(SELECTПР
FROMНаличие
WHEREК_во = 0))
GROUP BY Вид, Блюдо
ORDER BY Вид, 3;
В этом запросе предложение SELECT выполняется так же, как обычно, но результат не выводится на экран, а копируется в таблицу К_меню. Теперь с этой копией можно работать как с обычной базовой таблицей (Блюда, Про-дукты,…), т.е. выбирать из нее даннные на экран или принтер, обновлять в ней данные и т.п. Никакая из этих операций не будет оказывать влияния на исходные данные (например, изменение в ней названия блюда Салат летний на Салат весенний не приведет к подобному изменению в таблице Блюда, где сохранится старое название). Так как это может привести к противоречиям, то подобные временные таблицы уничтожают после их использования. Поэтому программа, обслуживающая шеф-повара, должна исполнять предложение DROP TABLE К_меню после того, как будет закончено составление меню.
Использование INSERT…SELECT для построения внешнего соединения
Рассмотренное в естественное соединение двух таблиц не включает тех строк какой-либо из них, для которых нет соответствующих строк в другой таблице. Например, если в таблицу Блюда были занесены под номером 34 сведения о Шашлыке, а рецепт его приготовления не был занесен в таблицу Рецепты, то при загрузке их естественного соединения в таблицу Временная:
CREATE TABLE Временная
(ВидCHAR (8),
БлюдоCHAR (60),
РецептCHAR (560));
INSERT
INTOВременная
SELECTВид, Блюдо, Рецепт
FROMБлюда, Рецепты, Вид_блюд
WHEREБлюда.БЛ = Рецепты.БЛ
ANDБлюда.В = Вид_блюд.В;
в ней не окажется строки с Шашлыком (в таблице Рецепты не обнаружен код 34, и строка с этим кодом исключена из результата).
Следовательно, в некотором смысле можно считать, что при обычном соединении теряется информация для таких несоответствующих строк. Однако иногда (как и в приведенном примере) может потребоваться способность сохранить эту информацию. В этом случае можно воспользоваться так называемым внешним соединением:
INSERT
INTOВременная
SELECTВид, Блюдо, Рецепт
FROMБлюда, Рецепты, Вид_блюд
WHEREБлюда.БЛ = Рецепты.БЛ
ANDБлюда.В = Вид_блюд.В;
INSERT
INTOВременная
SELECTВид, Блюдо, ???
FROMБлюда, Вид_блюд
WHEREБлюда.В = Вид_блюд.В
ANDБЛ NOT IN
(SELECTБЛ
FROMРецепты);
В результате будет создана базовая таблица
Вид БлюдоРецептЗакускаСалат летнийПомидоры и яблоки нарезать…Закуска Салат мясной Вареное охлажденное мясо, …. . .Напиток Кофе черный Кофеварку или кастрюлю спо…Напиток Кофе на молоке Сварить черный кофе, как …Горячее Шашлык???где первые 33 строки соответствуют первому INSERT и представляют собой проекцию естественного соединения таблиц Блюда и Рецепты по кодам блюд (БЛ), включающую три столбца. Последняя строка результата соответствует второму INSERT и сохраняет информацию о блюде Шашлык, рецепт котого пока не введен в таблицу Рецепты.
Заметим, что для внешнего соединения нужны два отдельных INSERT…SELECT. Однако тот же результат можно получить и одним INSERT…SELECT, используя фразу UNION, объединяющую предложения SELECT из двух INSERT:
INSERT
INTOВременная
SELECTВид, Блюдо, Рецепт
FROMБлюда, Рецепты, Вид_блюд
WHEREБлюда.БЛ = Рецепты.БЛ
ANDБлюда.В = Вид_блюд.В
UNION
SELECTВид, Блюдо, ???
FROMБлюда, Вид_блюд
WHEREБлюда.В = Вид_блюд.В
ANDБЛ NOT IN
(SELECTБЛ
FROMРецепты);
Предложение UPDATE
Обновление единственной записи
Изменить название блюда с кодом БЛ=5 на Форшмак, увеличить его выход на 30 г и установить NULL-значение в столбец Труд.
UPDATE Блюда
SETБлюдо = Форшмак, Выход = (Выход+30), Труд = NULL
WHERE БЛ = 5;
Обновление множества записей
Утроить цену всех продуктов таблицы поставки (кроме цены кофе ПР = 17).
UPDATE Поставки
SETЦена = Цена * 3
WHERE ПР <> 17;
Обновление с подзапросом
Установить равной нулю цену и К_во продуктов для поставщиков из Паневежиса и Резекне.
UPDATE Поставки
SETЦена = 0, К_во = 0
WHERE ПС IN
(SELECT ПС
FROMПоставщики
WHERE Город IN (Паневежис, Резекне));
Обновление нескольких таблиц
Изменить н?/p>