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

7.9.3. Корректирующие операторы Добавление

Запрос, приводящий к добавлению новых записей в конец суще­ствующей таблицы, называется запросом на добавление. Эти действия можно выполнить при использовании оператора INSERT.

Для добавления одной записи может быть использован оператор

INSERT INTO назначение [(поле_1[, поле_2[, ...]])]

VALUES (значение_1[, значение_2[,...])

Список полей может не задаваться, если значения вводятся во все поля, определенные в структуре таблицы.

Пример 1

INSERT INTO сотрудник

VALUES (32, "Ли", #12/30/189912:14:46#, "м", 1, #12/12/1970#, 2000, 1000, yes, "доцент", 21);

В примере 1 вводятся значения во все поля записи в таблице «Со­трудник», поэтому список полей в предложении INSERT INTO отсут­ствует.

Пример 2

INSERT INTO сотрудник (фио)

VALUES ("Мун");

Если не все поля определены в операторе INSERT (см. пример 2), в недостающие столбцы будет вставлено значение по умолчанию или значение Null.

В таблицу могут вводиться данные, полученные в результате вы­полнения запроса. В этом случае оператор выглядит следующим об­разом:

INSERT INTO назначение [(поле_1[, поле_2[,...]])] [IN внешняя БазаДанных]

SELECT [источник.]поле_1[, поле_2[,...]

FROM выражение

Пример 3

INSERT INTO сотрудник2

SELECT Сотрудник.Код_сотрудника AS Код_сотрудника, Сотрудник.ФИО AS ФИО, Сотрудник.Дата_рождения AS Дата_рождения, Сотрудник.Оклад AS Оклад

FROM сотрудник;

Если названия соответствующих полей в целевой таблице и в таб­лице, получающейся в результате выполнения вложенного SELECT, отличаются друг от друга, то в SELECT можно воспользоваться кон­струкцией AS, чтобы привести названия полей в соответствие друг другу (в качестве алиасных имен следует задать имена, используе­мые в целевой таблице). Использование разных имен в целевой таб­лице и таблице, получаемой в результате выполнения операции SELECT, также возможно. Необходимо только, чтобы они имели со­ответствующие друг другу типы данных.

Если в предложении SELECT перечислены не все поля, которые имеются в «целевой» таблице, то данные будут добавляться только в те поля, которые обозначены в SELECT.

Запрос на добавление из другой таблицы можно сконструировать, используя табличный язык QBE (см. разд. 6.2).

Обновление

Запрос на обновление изменяет значения некоторых полей ука­занной таблицы. Записи, которые подвергаются изменению, опреде­ляются на основе заданного условия отбора:

UPDATE таблица

SET новоеЗначение

WHERE условиеОтбора

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

Запрос

UPDATE сотрудник SET оклад =оклад*1,2;

увеличит оклады всех сотрудников на 20%.

Одновременно можно изменить значения нескольких полей запи­си. В этом случае выражения во фразе SET перечисляются через запятую:

UPDATE Заказы

SET СуммаЗаказа = СуммаЗаказа * 1.1,

СтоимостьДоставки = СтоимостьДоставки * 1.03

WHERE СтранаПолучателя = "Литва";

В рассмотренных выше примерах изменения затрагивали мно­жество записей, а новые значения получались путем вычисления. Изменения могут касаться и одной конкретной записи, а новое зна­чение может быть задано как константа. Например, если сотрудни­ца (Код_ сотрудника=25) вышла замуж и сменила фамилию, то соот­ветствующий запрос может выглядеть следующим образом:

UPDATE сотрудник

SET Фамилия = "Жукова", [семейное положение] = "замужем"

WHERE Код_сотрудника=25;

Имя поля [семейное положение] взято в квадратные скобки в связи с тем, что поле содержит пробел в имени, а для SQL это недопустимо.

В принципе запрос на корректировку может затрагивать несколь­ко связанных таблиц. Например, если мы хотим увеличить зарплату сотрудников, имеющих детей, на 20%, то запрос будет выглядеть сле­дующим образом:

UPDATE DISTINCTROW сотрудник INNER JOIN дети

ON сотрудник.Код_сотрудника = дети.Код_сотрудника

SET сотрудник.Оклад = [сотрудник]![Оклад]*1.2;

Запрос

UPDATE сотрудник INNER JOIN дети

ON сотрудник.Код_сотрудника = дети.Код_сотрудника

SET сотрудник.Оклад = [сотрудник]![Оклад]*1.2;

приведет к увеличению зарплаты на 20% за каждого из детей.

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