Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

Вставка явно заданного набора строк

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

table_value_constructor ::=

VALUES row_value_constructor_comma_list

row_value_constructor ::= row_value_constructor_element

| [ ROW ] (row_value_constructor_element_comma_list)

| row_subquery

row_value_constructor_element ::= value_expression

| NULL | DEFAULT

Самый простой пример использования этого варианта оператора вставки состоит в занесении в таблицу EMP явно задаваемых данных о новом служащем (пример 21.2):

INSERT INTO EMP

ROW (2445, 'Brown', '1985-04-08', 16500.00, 630, 772);

В этом примере явно заданы значения всех столбцов заносимой строки (как показывают синтаксические правила, ключевое слово ROW можно опустить). Возможен и такой вариант (пример 21.2.1):

INSERT INTO EMP

ROW ( 2445, DEFAULT, NULL, DEFAULT, NULL, NULL);

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

Если обладать полной информацией об определении таблицыEMP, то формулировку операциипримера 21.2.1можно переписать короче следующим эквивалентным образом (пример 21.2.2):

INSERT INTO EMP (EMP_NO) 2445;

Вспомним теперь, что одной из разновидностейvalue_expression_primaryявляетсяscalar_subquery(см. раздел17.2 «Скалярные выражения»лекции 17). Это означает, что в список элементов конструктора строки могут входить скалярные запросы, т. е. запросы, результат выполнения которых состоит из единственной строки, включающей единственный столбец. Поэтому допустима, например, такая операция вставки (пример 21.3):

INSERT INTO EMP VALUES

ROW (2445, (SELECT EMP_NAME

FROM EMP

WHERE EMP_NO = 2555),

'1985-04-08',

SELECT EMP_SAL

FROM EMP

WHERE EMP_NO = 2555),

NULL, NULL ),

ROW (2446, (SELECT EMP_NAME

FROM EMP

WHERE EMP_NO = 2556),

'1978-05-09',

(SELECT EMP_SAL

FROM EMP

WHERE EMP_NO = 2556),

NULL, NULL );

После выполнения этой операции в таблице EMPпоявятся две новые строки для служащих с уникальными идентификаторами2445и2446, причем первому из них будет присвоено имя и размер заработной платы служащего с уникальным идентификатором2555, а второму – аналогичные данные о служащем с уникальным идентификатором2556.

Вставка строк результата запроса

Наконец, обсудим вариант оператора вставки, когда набор вставляемых строк определяется через спецификацию запроса. Предположим, например, что требуется сохранить в отдельной таблицеDEPT_SUMMARYсведения о числе служащих каждого отдела, их максимальной, минимальной и суммарной заработной плате. Пусть таблицаDEPT_SUMMARYуже создана и имеет следующийзаголовок152):

DEPT_SUMMARY:

DEPT_NO : DEPT_NO

DEPT_EMP_NO : INTEGER

DEPT_MAX_SAL : SALARY

DEPT_MIN_SAL : SALARY

DEPT_TOTAL_SAL : SALARY

Тогда заполнить таблицу можно с помощью следующей операции вставки (пример 21.4):

INSERT INTO DEPT_SUMMARY

(SELECT DEPT_NO, COUNT(*), MAX (EMP_SAL),

MIN (EMP_SAL), SUM (EMP_SAL)

FROM EMP

GROUP BY DEPT_NO);