class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

основы sql

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

Dynamic SQL

прочее

Справочник по SQL

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

Для обновления записей используется команда 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;

Рейтинг@Mail.ru