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