Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

21.2.2. Оператор update для модификации существующих строк в существующих таблицах

Общий синтаксис оператора UPDATEвыглядит следующим образом:

UPDATE table_name SET update_assignment_commalist

WHERE conditional_expression

update_assignment ::= column_name =

{ value_expression | DEFAULT | NULL }

Семантика оператора модификации существующих строк определяется следующим образом:

  1. для всех строк таблицы с именем table_nameвычисляется булевское выражениеconditional_expression. Строки, для которых значением этого булевского выражения являетсяtrue, считаются подлежащими модификации (обозначим множество таких строк черезTm);

  2. каждая строкаs(s Tm) подвергается модификации таким образом, что значение каждого столбца этой строки, указанного в спискеupdate_assignment_commalist, заменяется значением, указанным в правой части соответствующего элемента спискамодификации153). Значения столбцов строкиs, не указанные в списке модификации, остаются неизменными.

152 Мы не будем приводить полное определение таблицы, включающее требуемые ограничения целостности.

153 Если в правой части элемента модификации присутствует value_expression, в котором содержится запрос, то в случае использования в этом запросе имен столбцов модифицируемой таблицы под значениями этих столбцов понимается значение до модификации.

Приведем примеры операций модификации таблиц.

Пример 21.5. Перевести всех служащих, выполняющих проект с номером 772, в отдел 632 и повысить им заработную плату на 1000 руб.

UPDATE EMP SET DEPT_NO = 632, EMP_SAL = EMP_SAL + 1000.00

WHERE PRO_NO = 772;

При выполнении данной операции на первом шаге в таблице EMPбудут найдены все строки, относящиеся к служащим, которые участвуют в проекте с номером772. На втором шаге во всех этих строках значение столбцаDEPT_NOбудет изменено на632, а к значению столбцаEMP_SALбудет прибавлено1000.00.

Пример 21.6. Для всех служащих, работающих в отделах, заработная плата менеджеров которых превышает 30000 руб., установить размер заработной платы, на 1000 руб. превышающий средний размер заработной платы соответствующего отдела, а номера проектов, в которых участвуют эти служащие, сделать неопределенными.

UPDATE EMP SET EMP_SAL = (SELECT AVG (EMP1_SAL)

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO)

+ 1000.00, PRO_NO = NULL

WHERE (SELECT EMP1.EMP_SAL

FROM EMP EMP1, DEPT

WHERE EMP.DEPT_NO = DEPT.DEPT_NO

AND DEPT_MNG = EMP1.EMP_NO AND) > 30000.00;

Конечно, если вам больше нравится другой стиль, то запрос, фигурирующий в разделеWHERE, можно переформулировать с использованием вложенного подзапроса (пример 21.6.1).

UPDATE EMP SET EMP_SAL = (SELECT AVG (EMP1_SAL)

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO)

+ 1000.00, PRO_NO = NULL

WHERE DEPT.NO IN (SELECT DEPT.DEPT_NO

FROM EMP, DEPT

WHERE DEPT_MNG = EMP_NO

AND EMP_SAL > 30000.00);

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