26. Добавление, изменение, удаление записей
Язык
SQL ориентирован на выполнение операций над группами записей, хотя в некоторых случаях операция может проводиться и над отдельной записью. Поэтому неудивительно, что операторы добавления, изменения и удаления записей в общем случае вызывают соответствующие операции над группами записей.ПОЯСНЕНИЕ. Все приводимые ниже операторы выполнялись в утилите
InterBase WISQL. Результаты выполнения операторов также показываются в виде, возвращаемом утилитой WISQL. Следует обратить внимание на представление дат - в WISQL они показываются в строковом виде. Не стоит беспокоиться о совместимости столбцов типа дата, когда выполняются операторы INSERT, UPDATE или DELETE при посредстве компонента TQuery из приложения, написанного на Delphi. Даты InterBase в приложениях, написанных на Delphi, без проблем представляются компонентами "поле типа даты и времени" TDateTimeField и отдельными переменными типа TDateTime. INSERTОператор
INSERT применяется для добавления записей в объект. В качестве объекта может выступать ТБД или просмотр (VIEW), созданный оператором CREATE VIEW. В последнем случае записи могут добавляться в несколькотаблиц.Формат оператора
INSERT:INSERT INTO
<объект> [(столбец1 [, столбец2 ...])|{VALUES
(<значение1> [, <значение2> ...]) | <оператор SELECT> }Список столбцов указывает столбцы, которым будут присвоены значения в добавляемых записях. Список столбцов может быть опущен. В этом случае подразумеваются все столбцы объекта, причем в том порядке, в котором они определены в данном объекте.
Поставить в соответствие столбцам списки значений можно двумя способами. Первый состоит в явном указании значений после слова
VALUES, второй - в формировании значений при помощи оператора SELECT.26.1.1. Явное указание списка значений
В этом случае оператор
INSERT применяется для добавления одной записи и имеет форматINSERT INTO
<объект> [(столбец1 [, столбец2 ...])]VALUES
(<значение1> [, <значение2> ...])Значения назначаются столбцам по порядку следования тех и других в операторе: первому по порядку столбцу назначается первое значение, второму столбцу - второе значение и т.д.
Пример. Добавить в таблицу ТОVARY новую запись:
INSERT INTO RASHOD (N_RASH, DAT_RASH,KOLVO, TOVAR, POKUP)
VALUES (45, "20-FEB-1997", 100, "
Сахар", "Саяны, ИЧП")Поскольку столбцы таблицы
RASHOD указаны в полном составе и именно в том порядке, в котором они перечислены при создании таблицы RASHOD оператором CREATE TABLE, оператор можно упростить:INSERT INTO RASHOD VALUES (45, "20-FEB-1997", 100, "
Сахар", "Саяны, ИЧП")Для установки уникального значения поля первичного ключа
N_RASH можно воспользоваться генератором:INSERT INTO RASHOD
VALUES (GEN_ID(RASHOD_N_RASH,2), "20-FEB-1997", 100,"
Сахар", "Саяны, ИЧП")26.1.2. Указание значений при помощи оператора
SELECTВторой формой оператора
INSERT являетсяINSERT INTO
<объект> [(столбец1 [, столбец2 ...])] <оператор SELECT>При этом значениями, которые присваиваются столбцам, являются значения, возвращаемые оператором
SELECT. Порядок их назначения столбцам аналогичен предыдущей форме оператора INSERT: значение первого по порядку столбца результирующего набора данных оператора SELECT присваивается первому столбцу оператора INSERT, второй - второму и т.д. Следует обратить внимание на важную особенность: поскольку оператор SELECT в общем случае возвращает множество записей, то и оператор INSERT в данной форме приведет к добавлению в объект аналогичного количества новых записей.Пример. Пусть в БД определена таблица
RASHOD_DATA, по составу и порядку следования полей аналогичная таблице RASHOD:CREATE TABLE RASHOD_DATA(
N_RASH INTEGER NOT NULL,
DAT_RASH DATE NOT NULL,
KOLVO INTEGER NOT NULL,
TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,
POKUP VARCHAR(20) COLLATE PXW_CYRL,
PRIMARY KEY(N_RASH)
);
Пусть в эту таблицу нужно ежедневно копировать все записи о расходах товара со склада за текущую дату. Представим, что эти сведения в дальнейшем ежедневно
переправляются в территориально удаленную бухгалтерию, к офису которой не успели подвести сетевые кабели (или вообще не собираются этого делать).
Тогда ежедневная выгрузка записей из таблицы
RASHOD в таблицу RASHOD_DATA будет реализовываться таким оператором:INSERT INTO RASHOD_DATA
SELECT * FROM RASHOD WHERE DAT_RASH = "20-JAN-1997"
Пусть перед выполнением данного оператора таблица
RASHOD_DATA пуста. Тогда после выполнения указанного оператора она будет иметь следующее содержимое:
N_RASH |
DAT_RASH |
KOLVO |
TOVAR |
POKUP |
8 |
20-JAN-1997 |
1000 |
Кока-кола |
Адмирал, АО |
7 |
20-JAN-1997 |
20 |
Кока-кола |
<null> |
6 |
20-JAN-1997 |
30 |
Сахар |
Саяны, ИЧП |
Оператор
UPDATE применяется для изменения значения в группе записей или - в частном случае - в одной записи объекта. В качестве объекта могут выступать ТБД или просмотр, созданный оператором CREATE VIEW. В последнем случае могут изменяться значения записей из нескольких таблиц.Формат оператора
UPDATE:UPDATE
<объект>SET
столбец1 = <значение1> (,столбец2 = <значение2>...][WHERE
<условие поиска >]При корректировке каждому из перечисленных столбцов присваивается соответствующее значение. Корректировка выполняется для всех записей, удовлетворяющих условию поиска. Условие поиска задается так же, как в операторе
SELECT.ВНИМАНИЕ !
Если опустить
WHERE <условие поиска>, в объекте будут изменены все записи.Пример. В таблице
RASHOD заменить дату на "24.01.97" и количество увеличить на 2 единицы для всех записей с датой "20.01.97":UPDATE RASHOD
SET DAT_RASH = "24-JAN-1997", KOLVO = KOLVO + 2
WHERE DAT_RASH = "20-JAN-1997"
Содержимое таблицы
RASHOD до выполнения оператора UPDATE:
NRASH |
DATRASH |
KOLVO |
TOVAR |
POKUP |
5 |
10-JAN-1997 |
4000 |
Кока-кола |
Саяны, ИЧП |
1 |
10-JAN-1997 |
100 |
Кока-кола |
Адмирал, АО |
2 |
10-JAN-1997 |
20 |
Сахар |
Лира, ТОО |
3 |
10-JAN-1997 |
509 |
Сахар |
<null> |
4 |
10-JAN-1997 |
3000 |
Ставрида консерв |
Адмирал, АО |
8 |
20-JAN-1997 |
1000 |
Кока-кола |
Адмирал, АО |
7 |
20-JAN-1997 |
20 |
Кока-кола |
<null> |
6 |
20-JAN-1997 |
30 |
Сахар |
Саяны, ИЧП |
Содержимое таблицы
RASHOD после выполнения оператора UPDATE:
NRASH |
DATRASH |
KOLVO |
TOVAR |
POKUP |
5 |
10-JAN-1997 |
4000 |
Кока-кола |
Саяны, ИЧП |
1 |
10-JAN-1997 |
100 |
Кока-кола |
Адмирал, АО |
2 |
10-JAN-1997 |
20 |
Сахар |
Лира, ТОО |
3 |
10-JAN-1997 |
509 |
Сахар . |
<null> |
4 |
10-JAN-1997 |
3000 |
Ставрида консерв. |
Адмирал, АО |
8 |
24-JAN-1997 |
1002 |
Кока-кола |
Адмирал, АО |
7 |
24-JAN-1997 |
22 |
Кока-кола |
<null> |
6 |
24-JAN-1997 |
32 |
Сахар |
Саяны, ИЧП |
Оператор
DELETE предназначен для удаления группы записей из объекта. В качестве объекта могут выступать ТБД или просмотр, созданный оператором CREATE VIEW. В последнем случае могут удаляться записи из нескольких таблиц. В частном случае может быть удалена только одна запись.Формат оператора
DELETE:DELETE FROM
<объект> [WHERE <условие поиска>];Удаляются все записи из объекта, удовлетворяющие условию поиска. Условие поиска задается так же, как в операторе
SELECT.ВНИМАНИЕ
! Если опустить WHERE <условие поиска>, из объекта будут удалены все записи.Пример. Удалить из таблицы
RASHOD все записи о расходе товара "Кока-кола" за дату "10.01.97".DELETE FROM RASHOD
WHERE (TOVAR = "
Кока-кола") AND (DAT_RASH = "10-JAN-1997")