Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_Изменение данных.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
112 Кб
Скачать
☆

Insert into Клиенты (Имя, Телефон, Сумма_заказа)

values

('Петров', '444-4444', 25300),

('Иванов', '555-5555', 45100),

('Сидоров', '777-7777', 1200),

('Захаров', '423-9870', 7800);

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

  • Insert into имяТаблицы (списокСтолбцов) select …

На практике нередко требуется загрузить в одну таблицу данные из другой таблицы. Например, ранее созданная таблица Контакты содержит имена и другие данные о клиентах, которые необходимо вставить в таблицу Клиенты. Для этого в операторе insert вместо values можно использовать оператор select, выбирающий записи, необходимые для вставки.

Допустим, таблицы Клиенты и Контакты имеют одноименные и однотипные столбцы Имя, Адрес и Телефон. Требуется добавить все записи из таблицы Контакты в таблицу Клиенты. Это можно сделать с помощью следующего запроса:

Insert into Клиенты (Имя, Адрес, Телефон)

select Имя, Адрес, Телефон from Контакты;

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

Insert into Клиенты (Имя, Адрес, Телефон)

select Имя, Адрес, Телефон from Контакты

where Клиенты.Имя < > Контакты.Имя and

Клиенты.Адрес < > Контакты.Адрес and

Контакты.Имя is not null;

Здесь в операторе where применено сложное условие на случай, если в таблицах окажутся однофамильцы или в таблице Контакты окажутся неопределенные имена. С помощью оператора insert можно добавить одну или несколько записей только в одну таблицу. Кроме того, необходимо учитывать следующие обстоятельства:

  • таблица может иметь столбец типа serial (счетчик), имеющий уникальные значения, которые СУБД назначает автоматически. Это обеспечивает уникальность всех записей таблицы и, следовательно, ее соответствие 1-ой нормальной форме. Поэтому в списке столбцов в операторе insert не следует указывать столбцы типа serial;

  • если список столбцов, указанный в операторе insert, содержит не все столбцы таблицы, то в оставшиеся столбцы (за исключением столбца типа serial) будут введены значения null (неопределенное значение), а в столбец типа serial правильное числовое значение введет СУБД;

  • при введении значений в столбцы новой записи необходимо следить, чтобы типы значений соответствовали типам столбцов таблицы. При необходимости можно воспользоваться функцией преобразования типов cast ();

  • таблица может иметь ограничения и если вводимые данные не удовлетворяют условиям этих ограничений, то запрос на добавление данных не будет выполнен. Так, например, если в ограничении на какой-либо столбец указано, что он не может иметь значения null, то попытка добавить пустую запись приведет к ошибке. В этом случае необходимо использовать оператор insert into с ключевым словом values, чтобы сразу ввести значение, удовлетворяющее ограничениям.

Удаление записей

Для удаления записей из таблицы применяется оператор delete (удалить):

delete from имяТаблицы where условие;

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

Следующий запрос удаляет записи из таблицы Клиенты, в которой значение столбца Имя равно 'Иванов':

delete prom Клиенты where Имя = 'Иванов';

Если таблица Клиенты содержит несколько записей, в которых есть клиент Иванов, то все они будут удалены. В операторе where может находиться подзапрос на выборку данных (оператор select). Подзапросы в операторе delete работают точно так же, как и в операторе select.

Пусть в базе данных имеется таблица Продажи (ID_товара, Сумма_заказа, ID_клиента), содержащая сведения о продажах товаров клиентам. Требуется удалить из этой таблицы записи о тех клиентах, которые приобрели товары на сумму, меньшую 1000. Для этого можно использовать такой запрос:

delete from Продажи Т1 where 1000 >=

(select sum(Т2.Сумма_заказа) from Продажи Т2 where T1. ID_клиента= Т2. ID_клиента);

Здесь запрос на удаление записей из таблицы Продажи содержит связанный (коррелированный) подзапрос, вычисляющий сумму значений столбца Сумма_заказа. Обратите внимание на использование двух различных псевдонимов для одной и той же таблицы. При выполнении данного запроса на удаление происходит, как и положено в случае связанных подзапросов, последовательный просмотр записей в таблице Продажи. Для каждой записи проверяется условие оператора where, а именно выполняется подзапрос, вычисляющий сумму значений столбца Сумма_заказа для всех записей, в которых идентификатор клиента равен значению этого идентификатора в текущей записи (текущей называется запись, просматриваемая в данный момент). Если вычисленное значение не превышает 1000, то условие оператора where выполняется и текущая запись удаляется, в противном случае запись не удаляется. Далее происходит переход к следующей записи, рассматриваемой в качестве текущей, и описанные действия повторяются снова.

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

  • Продажи (ID_товара, Сумма_заказа, ID_клиента);

  • Клиенты (ID_клиента, Имя, Адрес).

Требуется удалить из таблицы Клиенты те записи о клиентах, которые приобрели товары на сумму, меньшую 1000. Суммы заказов клиентов содержатся в таблице Продажи, а записи необходимо удалять из таблицы Клиенты, в которой нет данных о приобретенных товарах. Тем не менее, для решения этой задачи можно использовать запрос, аналогичный предыдущему:

delete from Клиенты T1

where 1000 >=

(select sum(Т2.Сумма_заказа) from Продажи Т2

where T1. ID_клиента= Т2. ID_клиента);

Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае семантических (но не синтаксических) ошибок при формулировке SQL-выражения. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рас­смотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку:

select * from Клиенты T1

where 1000 >=

(select sum(Т2.Сумма_заказа) from Продажи Т2

where T1. ID_клиента= Т2. ID_клиента);

Для удаления всех записей из таблицы достаточно использовать оператор delete без ключевого слова where. При этом сама таблица со всеми определенными в ней столбцами остается и готова для вставки новых записей. Например: delete from Клиенты;

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