ОТВЕТЫ К НЕКОТОРЫМ УПРАЖНЕНИЯМ
Как обычно, следующие решения не обязательно являются единственно возможными.
6.1. UPDATE P
SЕТ ЦВЕТ = 'Оранжевый'
WHERE ЦВЕТ = 'Красный';
6.2. DELETE
FROM J
WHERE НОМЕР_ПОСТАВЩИКА NOT IN
(SELECT НОМЕР_ИЗДЕЛИЯ
FROM SPJ);
6.3. CREATE TABLE КРАСНЫЕ
(НОМЕР_ПОСТАВЩИКА CHAR(5));
INSERT INTO КРАСНЫЕ (НОМЕР_ПОСТАВЩИКА)
SELECT DISTINCT НОМЕР_ПОСТАВЩИКА
FROM SPJ, P
WHERE SPJ. НОМЕР_ДЕТАЛИ = P. НОМЕР_ДЕТАЛИ
AND ЦВЕТ = 'Красный';
UPDATE SPJ
SET КОЛИЧЕСТВО = КОЛИЧЕСТВО * 1.1
WHERE НОМЕР_ПОСТАВЩИКА IN
(SELECT НОМЕР_ПОСТАВЩИКА
FROM КРАСНЫЕ);
DROP TABLE КРАСНЫЕ;
Заметим, что следующее «решение» с помощью одного предложения некорректно. Почему?
UPDATE SPJ
SET КОЛИЧЕСТВО = КОЛИЧЕСТВО * 1.1
WHERE НОМЕР_ПОСТАВЩИКА IN
(SELECT DISTINCT НОМЕР_ПОСТАВЩИКА
FROM SPJ, P
WHERE SPJ. НОМЕР_ДЕТАЛИ = Р. НОМЕР_ДЕТАЛИ
AND P. ЦВЕТ = 'Красный');
6.4. DELETE
FROM SPJ
WHERE 'Рим'=
(SELECT ГОРОД
FROM J
WHERE J.HOMEP_ИЗДЕЛИЯ=SPJ. НОМЕР_ИЗДЕЛИЯ);
DELETE
FROM J
WHERE ГОРОД == 'Рим';
6.5. INSERT
INTO S (НОМЕР_ПОСТАВЩИКА, ФАМИЛИЯ. ГОРОД)
VALUES ('S10', 'Уайт', 'Нью-Йорк');
или;
INSERT
INTO S (НОМЕР_ПОСТАВЩИКА, ФАМИЛИЯ, СОСТОЯНИЕ,ГОРОД)
VALUES ('S10', 'Уайт', 'NULL', 'Нью-Йорк');
6.6. CREATE TABLE СПИСОК_ДЕТАЛЕЙ
(НОМЕР_ДЕТАЛИ CHAR (6));
INSERT INTO СПИСОК_ДЕТАЛЕЙ (НОМЕР_ДЕТАЛИ)
SELECT DISTINCT НОМЕР_ДЕТАЛИ
FROM SPJ
WHERE НОМЕР_ПОСТАВЩИКА IN
(SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE ГОРОД = 'Лондон')
OR НОМЕР_ИЗДЕЛИЯ IN
(SELECT НОМЕР_ИЗДЕЛИЯ
FROM J
WHERE ГОРОД = 'Лондон');
6.7. CREATE TABLE СПИСОК_ИЗДЕЛИЙ (НОМЕР_ИЗДЕЛИЯ CHAR (4));
INSERT INTO СПИСОК_ИЗДЕЛИЙ (НОМЕР_ИЗДЕЛИЯ
SELECT НОМЕР_ИЗДЕЛИЯ
FROM J
WHERE ГОРОД == 'Лондон'
OR НОМЕР_ИЗДЕЛИЯ IN
(SELECT DISTINCT HOMEP_ИЗДЕЛИЯ
FROM SPJ
WHERE НОМЕР_ПОСТАВЩИКА IN
(SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE ГОРОД = 'Лондон'));
Замечание. Следующее решение некорректно:
INSERT INTO СПИСОК_ИЗДЕЛИЙ (НОМЕР_ИЗДЕЛИЯ)
SELECT НОМЕР_ИЗДЕЛИЯ
FROM J
WHERE ГОРОД = 'Лондон'
UNION
SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ
FROM SPJ
WHERE 'Лондон' =
(SELECT ГОРОД
FROM S
WHERE S. НОМЕР_ПОСТАВЩИКА =
SPJ НОМЕР_ПОСТАВЩИКА);
Операция UNION никогда не допускается в подзапросе (в любом контексте).
6.8. SELECT СОСТОЯНИЕ
FROM S
WHERE НОМЕР_ПОСТАВЩИКА = 'S4';
Результат:
СОСТОЯНИЕ |
Отсюда:
UPDATE S
SET СОСТОЯНИЕ = СОСТОЯНИЕ +10
WHERE СОСТОЯНИЕ < 20;
6.9. CREATE TABLE РЕЗУЛЬТАТ9
(НОМЕР_ИЗДЕЛИЯ CHAR(4),
НАЗВАНИЕ CHAR(IO),
ГОРОД CHAR(15)
НОМЕР_ПОСТАВЩИКА CHAR(5),
НОМЕР_ДЕТАЛИ CHAR(6),
КОЛИЧЕСТВО INTEGER);
INSERT
INTO РЕЗУЛЬТАТ9
SELECT J.*, SPJ. НОМЕР_ПОСТАВЩИКА,
SPJ. НОМЕР_ДЕТАЛИ, SPJ. КОЛИЧЕСТВО
FROM J, SPJ
WHERE J. НОМЕР_ИЗДЕЛИЯ = SPJ. НОМЕР_ИЗДЕЛИЯ;
INSERT
INTO РЕЗУЛЬТАТ9
SELECT J.*, 'bb', 'bb','0
FROM J
WHERE NOT EXISTS
(SELECT *
FROM SPJ
WHERE SPJ.HOMEP_ИЗДЕЛИЯ = J.HOMEP_ ИЗДЕЛИЯ);
6.10. CREATE TABLE PEЗУЛЬTAT10
(НОМЕР_ДЕТАЛИ CHAR(6),
НАЗВАНИЕ CHAR (20),
ЦВЕТ CHAR (6),
ВЕС SMALLINT,
ГОРОД SHAR(15),
НОМЕР_ИЗДЕЛИЯ CHAR(4),
НАЗВАНИЕ CHAR(10));
INSERT
INTO РЕЗУЛЬТАТ10
SELECT P.*, НОМЕР_ИЗДЕЛИЯ, НАЗВАНИЕ
FROM Р, J
WHERE Р. ГОРОД = J. ГОРОД;
INSERT
INTO РЕЗУЛЬТАТ10
SELECT Р. *, bb', bb'
FROM P
WHERE NOT EXISTS
(SELECT *
FROM J
WHEREJ. ГОРОД = Р. ГОРОД);
INSERT
INTO РЕЗУЛЬТАТ10
SELECT 'bb', 'bb', 'bb', 0, J.ГОРОД, J.НОМЕР_
ИЗДЕЛИЯ, J.НАЗВАНИЕ
FROM J
WHERE NOT EXISTS
(SELECT *
FROM P
WHERE P. ГОРОД = J. ГОРОД);
6.11. CREATE TABLE РЕЗУЛЬТАТ11
(НОМЕР_ПОСТАВЩИКА . . ., ФАМИЛИЯ . . ., СОСТОЯНИЕ . . ., ГОРОД_ПОСТАВЩИКА . . ., НОМЕР_ДЕТАЛИ .... НАЗВАНИЕ_ДЕТАЛИ . . , ЦВЕТ . . ., ВЕС . . ., ГОРОД_ДЕТАЛИ . . ., НОМЕР_ИЗДЕЛИЯ . . ., НАЗВАНИЕ_ИЗДЕЛИЯ .... ГОРОД_ИЗДЕЛИЯ . . ., КОЛИЧЕСТВО . . .);
INSERT INTO РЕЗУЛЬТАТ 11
SELECT S. *, P. *, J. *, SPJ. КОЛИЧЕСТВО
FROM S, P, J, SPJ
WHERE S. НОМЕР_ПОСТАВЩИКА = SPJ.НОМЕР_ПОСТАВЩИКА
AND P. НОМЕР_ДЕТАЛИ = SPJ. НОМЕР_ДЕТАЛИ
AND J. НОМЕР_ИЗДЕЛИЯ = SPJ. НОМЕР_ИЗДЕЛИЯ;
INSERT INTO РЕЗУЛЬТАТ11
SELECT S. *, 'bb', ‘bb', 'bb',0, ‘bb', 'bb', ‘bb','bb',0
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SPJ
WHERE SPJ. НОМЕР_ПОСТАВЩИКА = S. НОМЕР_ПОСТАВЩИКА);
INSERT INTO РЕЗУЛЬТАТ 11
SELECT 'bb', 'bb', 0, 'bb', P. *, 'bb', 'bb', 'bb', 0
FROM P
WHERE NOT EXISTS
(SELECT *
FROM SPJ
WHERE P. НОМЕР_ДЕТАЛИ = SPJ. НОМЕР_ДЕТАЛИ);
INSERT INTO РЕЗУЛЬТАТ 11
SELECT 'bb', 'bb', 0, 'bb', 'bb', 'bb', 'bb', 0, 'bb', J. *, 0
FROM J
WHERE NOT EXISTS
(SELECT *
FROM SPJ
WHERE SPJ.НОМЕР_ИЗДЕЛИЯ = J.НОМЕР_ИЗДЕЛИЯ);