Материал: Базы данных и их безопасность. Плотников Д.Г

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

WHERE EXISTS (SELECT *

FROM SPJ SPJA WHERE

SPJA.НОМЕР_ДЕТАЛИ = SPJY.НОМЕР_ДЕТАЛИ

AND SPJA.НОМЕР_ИЗДЕЛИЯ =

SPJX.НОМЕР_ИЗДЕЛИЯ)

AND NOT EXISTS (SELECT * FROM SPJ SPJB WHERE

SPJB.НОМЕР_ПОСТАВЩИКА = ’S1’ AND SPJB.НОМЕР_ДЕТАЛИ =

SPJY.НОМЕР_ДЕТАЛИ AND SPJB.НОМЕР_ИЗДЕЛИЯ =

SPJX.НОМЕР_ИЗДЕЛИЯ));

18. SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ

FROM SPJ SPJX WHERE NOT EXISTS

(SELECT * FROM SPJ SPJY WHERE EXISTS

(SELECT * FROM SPJ SPJA WHERE

SPJA.НОМЕР_ПОСТАВЩИКА = SPJY.НОМЕР_ПОСТАВЩИКА

AND SPJA.НОМЕР_ДЕТАЛИ IN

(SELECT

НОМЕР_ДЕТАЛИ

FROM P

WHERE ЦВЕТ = ’Красный’)

AND NOT EXISTS

301

(SELECT * FROM SPJ SPJB

WHERE SPJB.НОМЕР_ПОСТАВЩИКА =

SPJY.НОМЕР_ПОСТАВЩИКА AND SPJB.НОМЕР_ИЗДЕЛИЯ =

SPJX.НОМЕР_ИЗДЕЛИЯ)));

Стандартные функции

19.Выдать общее число изделий, для которых поставляет детали поставщик S1.

20.Выдать общее количество деталей Р1, поставляемых поставщиком S1.

21.Для каждой поставляемой для некоторого изделия детали выдать ее номер, номер изделия и соответствующее общее количество деталей.

22.Выдать номера изделий, для которых город является первым в алфавитном списке таких городов.

23.Выдать номера изделий, для которых средний объем поставки деталей Р1 больше наибольшего объема поставки любой детали для изделия J1.

24.Выдать номера поставщиков, поставляющих деталь Р1 для какого-либо изделия в количестве, большем среднего объема поставок детали Р1 для этого изделия.

Объединение

25.Постройте упорядоченный список всех городов, в которых размещаются, по крайней мере, один поставщик, деталь или изделие.

26.Приведите результат следующего предложения

SELECT:

SELECT Р.ЦВЕТ FROM Р

UNION

SELECT P.ЦВЕТ FROM Р;

302

8.4.Операции обновления

Вдвух последних частях весьма подробно было рассмотрено предложение выборки данных SELECT языка SQL. Обратим теперь наше внимание на предложения обновления данных UPDATE (обновить), DELETE (удалить) и INSERT (вставить).

Как и предложение SELECT, три предложения обновления данных оперируют не только базовыми таблицами,

но и представлениями. Однако не все представления являются обновляемыми. Если пользователь попытается выполнять операцию обновления над необновляемым представлением, система просто отвергнет эту операцию с соответствующим сообщением для пользователя. Предположим, следовательно, для целей данной части, что все таблицы, которые будут обновляться, являются базовыми таблицами.

Вследующих трех разделах подробно обсуждаются три операции обновления. Синтаксис этих операций следует тому же общему образцу, который был уже показан для операции SELECT. Для удобства в начале соответствующих разделов приводится в общих чертах синтаксис обсуждаемых предложений языка SQL.

Предложение update

Предложение UPDATE имеет следующий общий формат:

UPDATE таблица

SET поле = выражение

[, поле = выражение] … [WHERE предикат];

Все записи в «таблице», которые удовлетворяют «предикату», обновляются в соответствии с присваиваниями «поле = выражение» во фразе SET (установить).

303

Обновление единственной записи

Изменить цвет детали Р2 на желтый, увеличить ее вес на 5 и установить значение города «неизвестен» (NULL).

UPDATE Р

SET ЦВЕТ = ’Желтый’, ВЕС = ВЕС + 5, ГОРОД =

NULL

WHERE НОМЕР_ДЕТАЛИ = ’Р2’;

Для каждой записи, которая должна быть обновлена (т. е. для каждой записи, которая удовлетворяет предикату WHERE,. или для всех записей, если фраза WHERE опущена), ссылки во фразе SET на поля этой записи обозначают значения этих полей перед тем, как будет выполнено какое-либо присваивание в этой фразе SET.

Обновление множества записей

Удвоить состояние всех поставщиков, находящихся в Лондоне.

UPDATE S

SET СОСТОЯНИЕ = 2*СОСТОЯНИЕ

WHERE ГОРОД = ’Лондон’;

Обновление с подзапросом

Установить объем поставок равным нулю для всех поставщиков из Лондона.

UPDATE SP

SET КОЛИЧЕСТВО = 0 WHERE ’Лондон’ =

(SELECT ГОРОД FROM S

WHERE S.НОМЕР_ПОСТАВЩИКА = SP.НОМЕР_ПОСТАВЩИКА);

304

Обновление нескольких таблиц

Изменить номер поставщика S2 на S9.

UPDATE S

SET НОМЕР_ПОСТАВЩИКА = ’S9’

WHERE НОМЕР_ПОСТАВЩИКА = ’S2’;

UPDATE SP

SET НОМЕР_ПОСТАВЩИКА = ’S9’

WHERE НОМЕР_ПОСТАВЩИКА = ’S2’;

Невозможно обновить более одной таблицы в единственном запросе. Иными словами, в предложении UPDATE должна специфицироваться в точности одна таблица. Поэтому в данном примере мы сталкиваемся со следующей проблемой целостности (точнее, с проблемой

целостности по ссылкам): база данных становится противоречивой после выполнения первого предложения UPDATE — она включает теперь некоторые поставки, для которых не имеется соответствующей записи о поставщике, и остается в таком состоянии до тех пор, пока не будет выполнено второе предложение UPDATE. Изменение порядка предложений UPDATE, конечно, не решает эту проблему. Поэтому важно обеспечить выполнение обоих эти предложений, а не только одного.

Предложение delete

Предложение DELETE имеет следующий общий формат:

DELETE

FROM таблица [WHERE предикат];

Удаляются все записи в «таблице», которые удовлетворяют «предикату».

305

Источник: https://studfile.net/preview/16563653/