
- •Введение
- •Прочие команды
- •Структура базы данных
- •Ключи, ограничения
- •Индексы
- •Представления
- •Процедуры и функции
- •Триггеры
- •Пользователи и сессии
- •Инструментарий скачать субд
- •Инсталляция
- •Выполнение запросов
- •Использование примеров
- •Комментарий
- •Идентификаторы
- •Обзор типов данных
- •Интервал времени
- •Литералы
- •Выражения и операции
- •Строковые операции
- •Алгебраические операции
- •Операции отношения
- •Логические операции и предикаты
- •Условные выражения
- •Прочие операции
- •Обзор функций
- •Математические функции
- •Строковые функции
- •Работа с датами
- •Преобразование типов
- •Функции Oracle
- •Функции PostgreSql
- •Функции MySql
- •Создание таблицы
- •Значения полей по умолчанию
- •Ключи и ограничения
- •Настройка внешнего ключа
- •Создание по выборке
- •Дополнительные параметры таблицы
- •Изменение, удаление таблицы
- •Переименование таблицы или ее столбца
- •Добавление/удаление столбца
- •Первичный ключ
- •Уникальный ключ
- •Внешний ключ
- •Безошибочное удаление таблиц
- •Добавление записей
- •Значения по умолчанию
- •Подзапросы
- •Вставка по условию
- •Обновление записей
- •Обновление подзапросом
- •Обновление по данным другой таблицы
- •Удаление записей
- •Выборка записей
- •Выборка констант
- •Выборка по столбцам таблиц
- •Синонимы (алиасы)
- •Уникальные записи
- •Выборка по условию
- •Выборка по группам
- •Соединения
- •Агрегатные функции, группировка данных
- •Операции над выборками
- •Добавление итогов
- •Нумерация записей
- •Обеспечение уникальности первичного ключа
- •Столбцы с автоинкрементом
- •Индексы
- •Представления
- •Динамический sql (dsql)
- •Процедурные операторы блоковая структура кода
- •Присвоение
- •Условный оператор
- •Оператор выбора
- •Безусловный цикл
- •Цикл с предусловием
- •Цикл по счетчику
- •Цикл по элементам
- •Операторы выхода/продолжения итерации
- •Выборка в переменные
- •Хранимые процедуры
- •Вызов процедур
- •Исключения
- •Курсоры
- •Триггеры
- •Числа прописью
- •Транзакции, конкурирующие запросы
- •Управление аккаунтами пользователи
- •Права доступа
- •Права доступа MySql
- •Права доступа PostgreSql
- •Права доступа Oracle
- •Удаление прав доступа
- •Роли PostgreSql
- •Роли Oracle
- •Роли MySql
- •Файловый вывод/ввод
- •Информация о базе данных
Вставка по условию
Продвинутые СУБД предоставляют расширенные возможности по вставке данных. Например, в 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;