Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сведения о языке SQL.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
159.14 Кб
Скачать

Вставка по условию

Продвинутые СУБД предоставляют расширенные возможности по вставке данных. Например, в Oracle можно произвести вставку в несколько таблиц, и если нужно можно указать условия.

-- вставка в таблицы tbl1, tbl2, tbl3

-- по условию

INSERT ALL

-- в таблицу tbl1 если поле val в выборке меньше 100

WHEN val < 100 THEN

INTO tbl1

WHEN val > 100 AND val < 200 THEN

INTO tbl2

ELSE

INTO tbl3

SELECT ..., my_val AS val, ...;

Обновление записей

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

-- тестовая таблица

create table tblname (

id integer not null,

num double precision default 0.0,

num2 double precision default 5.5,

constraint pk_tblname primary key (id)

);

-- тестовые записи

insert into tblname(id,num) values(1,1.0);

insert into tblname(id,num) values(2,2.0);

insert into tblname(id,num) values(3,3.0);

insert into tblname(id,num) values(4,4.0);

insert into tblname(id,num) values(5,5.0);

insert into tblname(id,num) values(6,6.0);

commit;

-- просмотр результата вставки

select * from tblname

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

UPDATE tblname SET

-- задаем значение по умолчанию

num = default,

num2 = num2*2

WHERE id%2=0; -- для Oracle: WHERE mod(id,2)=0;

commit;

-- просмотр результата обновления

select * from tblname order by id

Обновление подзапросом

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

UPDATE tblname SET

num = (select 2 )

WHERE id%2!=0;

-- для Oracle

UPDATE tblname SET

num = (select 2 from dual)

WHERE mod(id,2)!=0;

Обновление по данным другой таблицы

Очень часто необходимо обновить поля данными из других таблиц. Для этого создадим еще одну таблицу с данными tblname1 таким же образом как tblname. Новая таблица будет служить источником данных. В качестве соответствия между записями двух таблиц выберем условие, при котором первичный ключ первой таблицы больше первичного ключа новой таблицы на 1. Также для удобства в запросах используем локальные синонимы (алиасы) для имен таблиц.

-- для Oracle

-- пользуемся тем, что в этой СУБД можно

-- обновить группу столбцов одним запросом.

-- предикат exist предотвращает изменение

-- первой записи значениями null

UPDATE tblname a SET

(num, num2)=

(

select num,num2

from tblname1 b

where a.id=b.id+1

)

WHERE exists (

select 1

from tblname1 b

where a.id=b.id+1

);

-- для PostgreSQL

UPDATE tblname as a SET

num=b.num,

num2=b.num2

FROM tblname1 as b

WHERE a.id=b.id+1;

-- для MySQL

UPDATE tblname a, tblname1 b SET

a.num=b.num,

a.num2=b.num2

WHERE a.id=b.id+1;

Oracle позволяет обновить одну таблицу, входящую в выборку, если она жестко связана с другими таблицами выборки первичными или уникальными ключами. Если в следующем примере попробовать указать условие a.id=b.id+1 для решения предыдущей задачи, то получим ошибку.

UPDATE

(

select a.*, b.num srcnum, b.num2 srcnum2

from tblname a, tblname1 b

where a.id=b.id

) a

SET

a.num=a.srcnum,

a.num2=a.srcnum2;