Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информационное обеспечение управляющих систем реального времени

..pdf
Скачиваний:
3
Добавлен:
15.11.2022
Размер:
3.63 Mб
Скачать

Список столбцов в операторе INSERT не является обязательным. Если он не указан, оператор INSERT должен включать значения для всех столбцов в таблице или представлении, а порядок их должен соответствовать порядку столбцов в таблице или представлении. Можно использовать ключевое слово DEFAULT, чтобы задать для строки значения, установленные по умолчанию.

Если список столбцов присутствует, формат его подобен формату, используемому для списка столбцов в операторе SELECT: имена столбцов отделяются запятыми. Поскольку оператор INSERT может добавлять строку только в одну таблицу, нет необходимости использовать идентификатор имени таблицы в имени столбца [29].

Базовый синтаксис: INSERT, имя таблицы, список столбцов, VALUES, а затем список добавляемых значений.

INSERT dbo.Products (ProductID, ProductName, Price, ProductDescription) VALUES (1, 'Clamp', 12.48, 'Workbench clamp')

Вставка значений по умолчанию

В таблице для некоторых столбцов могут быть определены значения по умолчанию. Требуется вставить строку значений по умолчанию, не задавая этих значений в запросе: create table D (id integer default 0)

Все СУБД поддерживают ключевое слово DEFAULT (по умолчанию) как средство явного задания значения по умолчанию для столбца.

Следующий пример иллюстрирует применение ключевого слова DEFAULT:

insert into D values (default)

Можно также явно задавать имя столбца. Если вставка осуществляется не во все столбцы таблицы, явное определение имени столбца обязательно:

insert into D (id) values (default)

191

SQL Server поддерживает оператор DEFAULT VALUES:

insert into D default values

Вставка значения NULL

Определение NULL в качестве значения столбца позволяет присваивать ему значение NULL, несмотря на любое заданное значение по умолчанию:

-- Skipping the column list, but keeping the values in order

INSERT dbo.Products VALUES (75, 'Tire Bar', NULL, 'Tool for changing tires.')

Вставка данных в столбец типа uniqueidentifier с помощью функции NEWID()

В следующем примере функция NEWID() вызывается для вставки идентификатора GUID в столбец column_2. Вотличие от столбцов идентификаторов, компонент Database Engine не создает автоматически значения для столбцов с типом данных uniqueidentifier, как показано во второй инструк-

ции INSERT.

IF OBJECT_ID ('dbo.T1', 'U') IS NOT

NULL

DROP TABLE dbo.T1; GO

CREATE TABLE dbo.T1

(

column_1 int IDENTITY, column_2 uniqueidentifier,

); GO

INSERT INTO dbo.T1 (column_2) VALUES (NEWID());

INSERT INTO T1 DEFAULT VALUES; GO

SELECT column_1, column_2 FROM dbo.T1; [11]

192

Копирование строк из одной таблицы в другую

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

Используйте выражение INSERT, за которым следует запрос, возвращающий необходимые строки:

insert into dept_east (deptno,dname,loc)

select deptno,dname,loc from dept

where loc in ( 'NEW YORK','BOSTON' )

Просто поставьте после выражения INSERT запрос, возвращающий требуемые строки. Если необходимо скопировать все строки исходной таблицы, уберите из запроса блок WHERE. Как и при обычной вставке, необязательно явно задавать, в какие столбцы должны быть вставлены значения. Но если имена столбцов не заданы, вставка будет производиться во все столбцы таблицы по порядку.

Копирование описания таблицы

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

В Oracle используйте команду CREATE TABLE с подзапросом, который не возвращает ни одной строки:

create table dept_2 as select * from dept where 1 = 0

При использовании конструкции Create Table As Select (CTAS) все строки, полученные в результате запроса, будут вставлены в новую таблицу. В предлагаемом решении вы-

193

ражение «1 = 0» в предикате WHERE обеспечивает тот факт, что запрос не возвратит ни одной строки. Таким образом, результатом выполнения данного выражения CTAS является пустая таблица, созданная на основании столбцов, указанных в операторе SELECT запроса.

ВSQL Server используйте оператор INTO в обычном SELECT запросе, который не возвращает ни одной строки: select * into dept_2 from dept where

1= 0

ВSQL Server при копировании таблицы с помощью

оператора INTO все строки, полученные в результате запроса, будут использоваться для заполнения новой таблицы. Выражение «1 = 0» в предикате обусловливает, что ни одна строка не будет возвращена. В результате получаем пустую таблицу, созданную на основании столбцов, указанных в операторе SELECT запроса.

Вставка во вложенное представление в Oracle

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

create view new_emps as select empno, ename, job from emp

Открывая доступ к этому представлению, вы разрешаете пользователям и программам вставлять данные только в эти три поля представления. Не давайте пользователям разрешение на вставку в таблицу EMP напрямую. Пользователи получат возможность создавать новые записи в EMP, вставляя данные в представление NEW_EMPS, но они смогут размещать значения только в трех столбцах, которые заданы в описании представления.

При вставке в простое представление, такое как приведено в данном решении, сервер базы данных вставит эти данные в базовую таблицу.

194

Например, вставка

new_emps(empno, ename, job) values (1, 'Jonathan', 'Editor')

будет преобразована сервером в следующий вид:

insert into emp (empno, ename, job) values (1, 'Jonathan', 'Editor')

Также можно вставлять данные во вложенное представление (в настоящее время поддерживается только

Oracle):

insert into (select empno, ename, job from emp) values (1, 'Jonathan', 'Editor')

2.25. Изменение записей в таблице

Требуется изменить значения некоторых или всех строк таблицы. Например, повысить заработные платы всех служащих 20-го отдела на 10 %. В следующем результирующем множестве представлены столбцы DEPTNO, ENAME и SAL с данными служащих этого отдела:

select deptno,ename,sal from emp

where deptno = 20 order by 1,3

Результат запроса: DEPTNO ENAME SAL 20 SMITH 800

20 ADAMS 1100

20 JONES 2975

20 SCOTT 3000

20 FORD 3000

Требуется увеличить все значения столбца SAL на 10 %. Для изменения существующих строк таблицы базы данных используйте выражение UPDATE (обновить). Например:

update emp

195

set sal = sal*1.10 where deptno = 20

Используйте выражение UPDATE с предикатом WHERE, чтобы указать, какие строки подлежат обновлению. Если опустить предикат WHERE, обновлены будут все строки. Выражение SAL*1.10 в данном решении возвращает заработную плату, увеличенную на 10 %. При подготовке к масштабным обновлениям может потребоваться предварительно просмотреть результаты. Сделать это можно, создав выражение SELECT, включающее выражения, которые планируется поместить в операторы SET. Следующее выражение SELECT показывает результат повышения зарплаты на 10 %:

select deptno,ename,sal as orig_sal,sal*.10 as amt_to_add,sal*1.10 as new_sal

from emp

where deptno=20 order by 1,5

DEPTNO ENAME ORIG_SAL AMT_TO_ADD NEW_SAL

20 SMITH 800 80 880

20 ADAMS 1100 110 1210

20 JONES 2975 298 3273

20 SCOTT 3000 300 3300

20 FORD 3000 300 3300

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

При необходимости следует осуществлять обновление

(UPDATE) или вставку (INSERT) с помощью merge:

merge into emp_commission ec using (select * from emp) emp

196

on (ec.empno=emp.empno) when matched then

update set ec.comm = 1000 delete where (sal < 2000) when not matched then insert

(ec.empno,ec.ename,ec.deptno,ec.comm) values

(emp.empno,emp.ename,emp.deptno,emp.comm)

Объединение в строке 3 решения определяет, какие строки уже существуют и будут обновлены. Объединяются таблица EMP_COMMISSION (под псевдонимом EC) и результат подзапроса (под псевдонимом EMP). Если объединение успешно, две строки считаются «совпавшими», и выполняется UPDATE в выражении WHEN MATCHED. В противном случае соответствие не обнаружено, и выпол-

няется INSERT в выражении WHEN NOT MATCHED. Та-

ким образом, строки таблицы EMP, значения столбца EMPNO которых не совпадают со значениями этого столбца ни в одной строке таблицы EMP_COMMISSION, будут вставлены в EMP_COMMISSION. Значения COMM в таблице EMP_COMMISSION будут обновлены только в тех записях служащих, для которых в таблице EMP столбец DEPTNO имеет значение 10. Записи всех остальных служащих будут просто вставлены. Кроме того, поскольку служащий MILLER имеет DEPTNO 10, он является кандидатом на обновление COMM, но в связи с тем, что его SAL меньше 2000, его запись удаляется из таблицы

EMP_COMMISSION.

UPDATE dbo.Products

SET ProductName = 'Flat Head Screwdriver'

WHERE ProductID = 50 GO [11]

197

2.26. Удаление записей из таблицы

Удаление всех записей из таблицы

Требуется удалить все записи из таблицы. Чтобы удалить записи из таблицы, используйте команду DELETE. Например, чтобы уничтожить все записи из таблицы EMP:

delete from emp

При использовании команды DELETE без предиката WHERE удаляются все записи из заданной таблицы.

TRUNCATE TABLE

TRUNCATE TABLE [[database.]owner.]table_name

Уничтожает данные в таблице, но оставляет ее структуру и индексы нетронутыми. Пример:

TRUNCATE TABLE authors

Удаление определенных записей

Требуется удалить из таблицы записи, отвечающие определенному критерию. Используйте команду DELETE с предикатом WHERE, определяющим, какие строки подлежат удалению. Например, удалим всех служащих 10-го отдела:

delete from emp where deptno = 10

Применяя команду DELETE в сочетании с блоком WHERE, можно удалять не все строки из таблицы, а только некоторые из них.

Удаление одной записи по первичному ключу

В примере для удаления используется первичный ключ. Например, удалим запись о служащем CLARK (EMPNO 7782):

delete from emp where empno = 7782

198

Удаление записей, которые нарушают ссылочную целостность

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

delete from emp

where not exists ( select * from dept where dept.deptno = emp.deptno)

Или можно написать запрос с предикатом NOT IN:

delete from emp

where deptno not in (select deptno from dept)

При удалении самое главное – правильно описать в предикате WHERE строки, подлежащие удалению.

В решении с NOT EXISTS используется связанный подзапрос для проверки существования в таблице DEPT записи, значение DEPTNO которой соответствует DEPTNO заданной записи таблицы EMP. Если такая запись есть, то запись EMP сохраняется. В противном случае она удаляется. Такая проверка проводится для всех записей таблицы EMP. В решении с предикатом IN используется подзапрос для извлечения списка действительных номеров отделов. Затем значения столбца DEPTNO всех записей таблицы EMP сравниваются с этим списком. Если обнаруживается запись, DEPTNO которой не соответствует значениям списка, она удаляется из таблицы EMP.

Уничтожение дублирующихся записей

Требуется уничтожить дублирующиеся записи из таблицы. Рассмотрим следующую таблицу:

create table dupes (id integer, name varchar(10))

199

insert into dupes values (1, 'NAPOLEON')

insert into dupes values (2, 'DYNAMITE')

insert into dupes values (3, 'DYNAMITE')

insert into dupes values (4, 'SHE SELLS')

insert into dupes values (5, 'SEA SHELLS')

insert into dupes values (6, 'SEA SHELLS')

insert into dupes values (7, 'SEA SHELLS')

select * from dupes order by 1 ID NAME

1NAPOLEON

2DYNAMITE

3DYNAMITE

4SHE SELLS

5SEA SHELLS

6SEA SHELLS

7SEA SHELLS

Для каждой группы дублирующихся имен, таких как SEA SHELLS, необходимо сохранить один произвольно выбранный ID и уничтожить остальные. В случае с SEA SHELLS не важно, будут ли уничтожены записи с ID 5 и 6, или 5 и 7, или 6 и 7, но в итоге должна остаться всего одна запись для SEA SHELLS.

Для удаления повторяющихся записей используется подзапрос с агрегатной функцией MIN (в данном случае в таблицеостаетсятолькозаписьсминимальным значениемID):

delete from dupes

where id not in ( select min(id) from dupes group by name )

200