ОТВЕТЫ К НЕКОТОРЫМ УПРАЖНЕНИЯМ

 

Как обычно, следующие решения не обязательно являются единственно возможными.

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.НОМЕР_ИЗДЕЛИЯ);