Операторы манипулирования данными

Операторы языка манипулирования данными DML управляют значениями, представляемыми в таблицах. Значения могут быть помещены и удалены из полей тремя операторами языка DML: INSERT (вставить), UPDATE (модифицировать), DELETE (удалить).

Оператор Вставка INSERT

Все строки в SQL вводятся с использованием команды модификации INSERT. В самой простой форме INSERT использует следующий синтаксис:

Имя таблицы должно быть предварительно определено в команде CREATE TABLE, а каждое значение в предложении значений должно совпадать с типом данных столбца, в который оно вставляется. В стандарте ANSI эти значения не могут составлять выражений. Это означает, что 3 – разрешено, а выражение 2 + 1 – нет. Значения можно вводить в таблицу без указания имени поля, тогда первое значение в предложении значений автоматически попадает в столбец 1, второе в столбец 2 и т.д.

Если требуется ввести пустое значение (NULL), то его вводят точно так же, как и обычное значение:

Тогда имя_поля_1 таблицы имя_таблицы будет иметь значение NULL. Так как значение NULL – это специальный маркер, а не просто символьная константа, он не включается в одиночные кавычки.

Можно также использовать команду INSERT, чтобы получать или выбирать значения из одной таблицы и помещать их в другую, чтобы использовать их вместе с запросом. Чтобы сделать это, надо просто заменить предложение VALUES (из предыдущего примера) на соответствующий запрос:

Здесь выбираются все значения, произведенные запросом – то есть все строки из таблицы имя_таблицы_2 со значениями, соответствующими условию, и помещаются в таблицу, называемую имя_таблицы_1. Чтобы это работало, таблица имя_таблицы_1 должна отвечать следующим условиям:

1) она должна уже быть создана командой CREATE TABLE;

2) она должна иметь столбцы, которые совпадают с таблицей имя_таблицы_2 и имеют соответствующий тип данных, то есть первый, второй и так далее, столбцы каждой таблицы должны иметь одинаковый тип данных (причем они не должны иметь одинаковых имен ).

Другими словами, столбцы таблицы, в которые вставляются данные, должны совпадать со столбцами, выводимыми подзапросом, в данном случае для всей таблицы имя_таблицы_2. Имя_таблицы_1 – это теперь независимая таблица, которая получила некоторые значения из таблицы имя_таблицы_2. Если значения в имя_таблицы_2 будут вдруг изменены, это никак не отразится на таблице имя_таблицы_1.

Оператор Удаление DELETE

Команда DELETE позволяет удалять строки из таблицы. Она может удалять только введенные строки, а не индивидуальные значения полей, так что параметр поля является необязательным или недоступным. Чтобы удалить все содержание таблицы имя_таблицы_1, надо ввести следующее условие:

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

Теперь, когда таблица пуста, ее можно окончательно удалить командой DROP TABLE (см. далее). Обычно нужно удалить только некоторые определенные строки из таблицы. Чтобы определить, какие строки будут удалены, используется условие так же, как это делалось для запросов:

DELETE FROM имя_таблицы_1 WHERE условие;

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

Оператор модифицирования UPDATE

Изменение значений поля выполняется командой UPDATE. Эта команда содержит предложение UPDATE, в котором указано имя используемой таблицы, предложение SET, которое указывает на изменение, которое нужно сделать для определенных столбцов, и предложение WHERE, условие которого определяет модифицируемые записи.

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

SET имя_поля_1 = значение_поля_1, имя_поля_2 =

значение_поля_2,... WHERE условие;

Если нужно модифицировать всю таблицу, оператор WHERE не указывается. Однако невозможно модифицировать сразу много таблиц в одной команде частично потому, что нельзя указывать в предложении SET имя таблицы для изменяемого поля. Другими словами, вы не можете записать:

SET Имя_таблицы.Имя_поля = значение_поля

в команде UPDATE, а можно только записать:

“SET имя_поля = значение_поля “.

Язык SQL разрешает использование выражений в предложениях модификации. Можно использовать скалярные выражения в предложении SET команды UPDATE. В этом отличие от предложения VALUES команды INSERT, в котором выражения не могут использоваться. Например запись

UPDATE имя_таблицы SET имя_поля = имя_поля * 2

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

Предложение SET также может вводить пустые NULL:

UPDATE имя_таблицы SET имя_поля = NULL WHERE условие; что обнулит поля имя_поля таблицы, имя_таблицы, соответствующие данному условию.

Курсор

10.

Одно из сильных качеств SQL – это способность функционировать на всех строках таблицы, чтобы встретить определенное условие как блок записей, не зная сколько таких строк там может быть. Если десять строк удовлетворяют условию, то запрос может вывести все десять строк. Если десять миллионов строк определены, все десять миллионов строк будут выведены. Это вызывает определенные затруднения при работе с базовым языком. Например, проблема “встраивания” предложения SELECT в прикладную программу – порождение предложением SELECT таблиц с множеством строк и столбцов, для обработки которых включающий язык программирования не обладает хорошими средствами, позволяющими оперировать одновременно более чем одной записью (строкой). Или, как можно назначать вывод запроса для переменных, когда не известно, как велик будет вывод? Решение состоит в том, чтобы использовать то, что называется – курсором. Курсор в SQL – средство, которое состоит из некоторого рода указателя, используемого для просмотра множества записей путем поочередного указывания каждой записи в данном множестве, что обеспечивает возможность обращения к одной конкретной записи средствами включающего языка программирования. Можно рассматривать SQL-курсор как устройство, которое отмечает место в выводе запроса. Курсор – это вид переменной, которая связана с запросом. Значением этой переменной может быть каждая строка, которая выводится при запросе. Курсоры должны быть объявлены прежде, чем они будут использованы. Это делается командой DECLARE CURSOR следующим образом:

EXEC SQL DECLARE CURSOR имя_курсора FOR

SELECT *

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

WHERE условие;

Запрос не выполнится немедленно; он только определяется. Курсор немного напоминает представление, в котором курсор содержит запрос, а содержание курсора напоминает любой вывод запроса каждый раз, когда курсор становится открытым. Однако в отличие от базовых таблиц или представлений строки курсора упорядочены: имеются первая, вторая и последняя строки курсора. Этот порядок может быть произвольным с явным управлением с помощью предложения ORDER BY в запросе или же по умолчанию следовать какому-то упорядочению, определяемому инструментально-определяемой схемой.

Когда в программе надо выполнить запрос, надо открыть курсор с помощью следующей команды:

EXEC SQL OPEN CURSOR имя_курсора;

Значения в курсоре могут быть получены, когда выполняется именно эта команда, но не предыдущая команда DECLARE и не последующая команда FETСH. Команда FETCH используется для выборки из этого запроса по одной строке каждый раз:

EXEC SQL FETCH имя_курсора INTO : имя переменной_1, имя переменной_2, …;

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

Для освобождения курсора значений используется оператор CLOSE CURSOR, соответствующий оператору OPEN CURSOR:

EXEC SQL CLOSE CURSOR имя_курсора;

Наши рекомендации