Запросы INSERT, UPDATE, DELETE.

Язык манипулирования данными.

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

Запросы, связанные с изменением данных, достаточно просты на первый взгляд. Но надо помнить, что в реляционных СУБД мы оперируем не отдельными записями, а множествами записей. Соответственно, и запросы в языке SQL применяются не к отдельным записям, а к их множествам (разве что, запрос на добавление записи выбивается из этого ряда). Поэтому, при формулировании запросов на обновление и удаление данных надо быть очень аккуратным, чтобы не затронуть лишние записи. Часто бывает так, что отменить выполненный запрос нет возможности, и если он сформулирован неудачно, а резервной копии нет – то можно столкнуться с потерей данных.

Мы начнем наше рассмотрение с запроса на добавление записей. Его синтаксис следующий (указаны основные элементы):

INSERT INTO имя_таблицы [(имя_поля [, ...])]

{DEFAULT VALUES | VALUES (значение [, ...]) |выражение SELECT};

Запрос INSERT может выполняться двумя способами – с указанием списка полей для вставки или без него. Список полей может следовать после имени таблицы. Если он присутствует, то данные будут помещены только в указанные поля, для остальных будут использованы значения по умолчанию (если они заданы) или значения NULL. Очевидно, что если не указать поле, для которого установлен запрет пустых значений, а значение по умолчанию не задано, то в результате будет получена ошибка, а запись добавлена не будет.

Значения для вставки можно указать тремя способами. Первый – использование ключевых слов DEFAULT VALUES. В этом случае поля будут заполнены значениями по умолчанию (где они заданы) или оставлены пустыми. Точно так же, может возникнуть ошибка, если значения по умолчанию для поля не задано, а запрет пустых значений задан.

Второй способ – использование списка значений, которыми должны быть заполнены поля. Значения в списке должны соответствовать списку полей, если он имеется, или порядку полей в таблице, если списка полей нет. То есть, должны иметь подходящий тип и размер. Вместо конкретного значения можно указать ключевое слово DEFAULT для использования значения по умолчанию, или NULL для использования пустого значения.

Наконец, третий способ – использования запроса на выборку для формирования добавляемых строк. Сам запрос на выборку не отличается от обычного, поэтому специально мы на нем останавливаться в данный момент не будем. Разумеется, поля в выборке должны соответствовать списку полей для вставки или структуре таблицы, если списка нет. Кроме того, нельзя использовать таблицу, в которую вставляются данные, в запросе на выборку (причина, думается, очевидна). В этом варианте строк в таблицу будет добавлено столько, сколько вернет запрос на выборку. В предыдущих вариантах запрос добавит только одну строку.

Для примера, добавим строку в таблицу Студент:

INSERT INTO Студент

VALUES (‘ВЗЭКУ97-16’, ‘Иван’, ‘Иванович’, ‘Иванов’, #10/03/1991#, ‘3305’, ‘234987’, ‘79123645 АР’, DEFAULT, ‘ВЗЭКУ97’);

Мы использовали вариант без списка полей, так что значения перечислены в соответствии с порядком следования их в таблице. Для поля РоднойГород использовано значение по умолчанию.

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

UPDATE имя_таблицы

SET {имя_поля = DEFAULT |NULL |скалярное_выражение,

[, ...]}

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

То есть, мы указываем таблицу, данные в которой хотим обновить, а после ключевого слова SET перечисляем через запятую имена полей и значения, которые им нужно задать. Можно указать в одном запросе любое количество полей, но каждое можно указывать только один раз.

Условие отбора служит для определения того, какие именно записи необходимо изменить. Если не указать это условие, то будут изменены все записи в таблице (что бывает нужно, но довольно редко). Порядок задания условия совпадает с запросом на выборку, поэтому здесь мы не будем на нем останавливаться, а рассмотрим его в соответствующем разделе.

Для примера изменим отчество в записи о студенте, которую добавили при рассмотрении запроса INSERT:

UPDATE Студент

SET Отчество = ‘Петрович’

WHERE НомерЗачетки = ‘ВЗЭКУ97-16’;

Наконец, запрос на удаление записей формулируется еще проще:

DELETE FROM имя_таблицы

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

Так как запись может быть удалена только целиком, то указывать какие-то имена полей не нужно. Условие WHERE используется аналогично запросу на обновление. Если условие не указано, то будут удалены все записи в таблице. С запросом на удаление надо быть очень аккуратным – если напутать с условиями отбора, можно удалить лишние записи, восстановить которые возможно далеко не всегда. Поэтому, есть смысл сначала сформулировать запрос на выборку с условием отбора, которое планируется задействовать в запросе DELETE. Если запрос на выборку вернет именно те записи, которые и планируется удалить, то можно смело выполнять запрос на удаление.

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