Организация 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>