Название: Базы данных. Концепция баз данных, реляционная модель данных, языки SQL и XML (Токмаков Г. П.)

Жанр: Информационные системы и технологии

Просмотров: 1410


4.6. операторы обновления данных

 

4.6.1. О ПЕРАТ О Р   INSERT

 

Добавление строки в  реляционную таблицу происходит тогда, когда во

«внешнем  мире»  появляется  новый  объект,  представляемый  этой  строкой.

На примере учебной базы данных это выглядит следующим образом:

– если вы принимаете на работу нового сотрудника, в таблицу СОТРУДНИКИ

необходимо добавить новую строку с информацией о нем;

– если служащий заключает договор с новым клиентом, в таблицу CLIENTY

должна быть добавлена новая строка, представляющая этого клиента;

– если клиент делает заказ, в таблицу ZAKAZY требуется добавить новую стро-

ку, содержащую сведения об этом заказе.

Во всех приведенных примерах новая строка добавляется для того, чтобы база данных оставалась точной копией реального мира. Наименьшей единицей

информации, которую можно добавлять в реляционную базу данных, является одна строка.

Для добавления строки в реляционную таблицу применяется инструкция INSERT. В качестве объекта может выступить таблица базы данных или про- смотр (VIEW), созданный оператором CREATE VIEW. В последнем случае записи

могут добавляться сразу в несколько таблиц. Формат оператора INSERT

 

INSERT INTO <объект> [(столбец1 [, столбец2 ...])]

{VALUES (<значение1> [, <значение2> ...])|<оператор SELECT>}

Список столбцов указывает столбцы, которым будут присвоены значения в добавляемых записях. Список столбцов может быть опущен. В этом случае подразумеваются все столбцы объекта, причем в том порядке, в котором они определены в данном объекте.

Поставить в соответствие столбцам списки значений можно двумя спосо-

бами. Первый состоит в явном указании значений после слова VALUES, второй −

в формировании значений при помощи оператора SELECT.

 

Однострочная  инстру к ция  INSERT

 

Однострочная инструкция INSERT применяется для добавления одной запи-

си в таблицу и имеет формат

 

INSERT INTO <объект> [(столбец1 [, столбец2 ...])] VALUES (<значение1> [, <значение2> ...])

 

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

− второе значение и т. д.

Пример: добавить информацию о новом служащем в таблицу SLUZHASCHIE:

 

INSERT INTO SLUZHASCHIE (ID_SLUZH, FAMILY, NAME, AGE, MNGR, ID_OFC, QUOTA)

VALUES (211, Аршавин, Андрей, 25, 106, 11, $3 000)

 

В приведенной инструкции данные о продажах нового служащего не вво- дятся, так как их у него еще нет. Поэтому при определении таблицы инструк- цией CREATE TABLE, либо нужно определить для этого поля значение по умолча- нию (ключевое слово DEFAULT), либо нужно допустить значение NULL (т. е. в оп- ределении этого поля не должно быть ключевого слова NOT NULL).

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

CREATE TABLE, оператор можно упростить:

 

INSERT INTO SLUZHASCHIE

VALUES (211, Аршавин, Андрей, 25, 106, 11, $3 000, $0.00)

 

Для  установки  уникального  значения  поля  первичного  ключа  ID_SLZH

можно воспользоваться генератором:

 

INSERT INTO SLUZHASCHIE

VALUES (GEN_ID(ID_SLUZH, 2), Аршавин, Андрей, 25, 106, 11, $3 000, $0.00)

 

Многострочная  инстру кция  INSERT

 

Многострочная инструкция INSERT добавляет в целевую таблицу несколько строк и имеет следующий формат:

 

INSERT INTO <объект> [(столбец1 [, столбец2 ...])]

<оператор SELECT>}

При этом значениями, которые присваиваются столбцам, являются значе- ния, возвращаемые оператором SELECT. Порядок их назначения столбцам анало- гичен предыдущей форме оператора INSERT: значение первого по порядку столбца результирующего набора присваивается первому столбцу оператора INSERT, второй − второму и т. д. Следует обратить внимание на важную особен- ность: поскольку оператор SELECT в общем случае возвращает множество запи- сей, то и оператор INSERT в данной форме приведет к добавлению аналогичного числа новых записей.

Пример. Скопировать старые заказы в таблицу OLDORDERS:

 

INSERT INTO OLDORDERS (ID_ORDER, ORDER_DATE, PRICE) SELECT ID_ORDER, ORDER_DATE, PRICE

FROM ZAKAZY

WHERE ORDER_DATE < ’01‐JAN‐2002’

 

4.6.2. О ПЕРАТ О Р  UPDATE

 

Операция обновления данных UPDATE требуется тогда, когда происходят изменения во внешнем мире и их надо адекватно отразить в базе данных.

Инструкция обновления UPDATE имеет формат

 

UPDATE имя_табл

SET     имя_столбца = новое_значение

[WHERE условие_отбора]

 

В инструкции указывается целевая таблица, которая должна быть модифи- цирована, при этом пользователь должен иметь разрешение на обновление таб- лицы и каждого конкретного столбца. Предложение WHERE отбирает строки таб- лицы, подлежащие обновлению. В предложении SET указывается, какие столб- цы должны быть обновлены, и для них задаются новые значения.

Пример. Перевести всех служащих из Инзенского офиса (идентификатор

22) в Тверской офис (идентификатор 12) и понизить их личные планы (поле QU‐

OTA) на 10 процентов.

 

UPDATE SLUZHASCHIE

SET     ID_OFC = 12, QUOTA = 0.9*QUOTA WHERE       ID_OFC = 22

 

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

Пример. Увеличить планы для всех сотрудников на пять процентов.

 

UPDATE SLUZHASCHIE

SET     QUOTA = 1.05*QUOTA

 

В инструкции UPDATE можно использовать подчиненные запросы, посколь- ку они дают возможность отбирать строки для обновления, опираясь на инфор- мацию из других таблиц.

Пример. Увеличить на $5 000 лимит кредита для тех клиентов, которые

сделали заказ на сумму более $5 000.

 

UPDATE SLUZHASCHIE

SET     QUOTA = QUOTA + 5000.00

WHERE           ID_SLZH IN (SELECT DISTINCT ID_CLN FROM ZAKAZY

WHERE PRICE > 25000)

 

4.6.3. О ПЕРАТ О Р  DELETE

 

Оператор удаления данных позволяет удалить одну или несколько строк из таблицы в соответствии с условиями, которые задаются для удаленных строк.

Синтаксис оператора DELETE следующий

 

DELETE

FROM имя_табл

[WHERE условия_отбора]

 

В  предложении FROM указывается таблица, содержащая строки, которые требуется удалить. В предложении WHERE указывается критерий отбора строк, которые должны быть удалены. Если условия отбора не задаются, то из табли- цы удаляются все строки, однако это не означает, что удаляется вся таблица. Исходная таблица остается, но она остается пустой, незаполненной. Условия отбора в части WHERE имеют тот же вид, что и условия фильтрации в операторе SELECT.

Предположим, что некий сотрудник решил уволиться из компании. Вот ин- струкция DELETE, удаляющая, относящуюся к данному сотруднику строку из таблицы СОТРУДНИКИ

 

DELETE

FROM SLUZHASCHIE

WHERE FAMILY = ’Быков’ AND NAME = ‘Игорь’

 

В предложении WHERE может находиться встроенный запрос. Например, ес- ли нам надо удалить все заказы принятые уволенным сотрудником необходимо использовать условие отбора с встроенным запросом.

 

DELETE

FROM ZAKAZY

WHERE ID_SLZH = (SELECT ID_SLUZH

FROM SLUZHASCHIE

WHERE           FAMILY = ’Быков’ AND NAME = ‘Игорь’)

 

Встроенный запрос находит идентификатор сотрудника с фамилией Быков и именем Игорь, а затем предложение WHERE отбирает заказы с данным идентифи- катором. Как видно из этого примера, встроенные запросы в инструкции DELETE играют важную роль, поскольку они позволяют удалять строки, основываясь на информации, содержащейся в других таблицах.