7.4.2. Добавление данных – команда INSERT
Рассмотрим некоторые возможности заполнения таблиц. Данные в таблицу могут быть внесены различными способами:
С помощью команды INSERT. Используя команду INSERT, можно добавить как одну строку, так и множество строк.
С помощью команды SELECTINTO. В этом случае на основе результата выборки, возвращаемого запросом, автоматически создается новая таблица (аппарат использования команды рассмотрен выше).
Рассмотрим процесс внесения данных в таблицу с помощью команды INSERT. Как уже было сказано, эта команда может быть использована для вставки как одной, так и множества строк.
Вставка одной строки
В простейшем случае вставка данных с помощью команды INSERT предполагает использование конструкции INSERT-VALUES:
INSERT [INTO] <имя_таблицы> [(<список_колонок>)]
VALUES (<список_значений>)
С помощью этой команды можно добавить только одну строку.
Аргумент <имя_таблицы> идентифицирует имя таблицы, в которую необходимо вставить строку данных. Необязательный параметр <список_столбцов> задает имена столбцов, в которые будет производиться добавление данных.
Рассмотрим процесс добавления данных в таблицу «Сводная_ведомость». Каждая строка этой таблицы содержит результат сдачи экзамена (зачета) по отдельной дисциплине отдельным студентом. Если студент, ID_Студент которого равен 10, сдал экзамен по дисциплине со значением 3 в столбце ID_Дисциплина на оценку «5», то команда добавления этих данных в таблицу «Сводная_ведомость» выглядит следующим образом:
INSERT Сводная_ведомость
VALUES (10, 3, 5)
Для назначения произвольного порядка и состава столбцов в этом случае можно использовать следующую команду:
INSERTINTO Сводная_ведомость
(ID_Дисциплина, ID_Студент)
VALUES (3, 10)
Если для столбца Оценка определено значение по умолчанию или разрешено хранение значений NULL, то значение для этого столбца можно вообще не указывать:
Мы рассматривали вставку строк в таблицу, значения для которых были заданы с помощью констант. Однако вставляемые значения можно идентифицировать и с помощью переменных, функций, а также любых сложных выражений. Единственным требованием является совпадение типов данных столбца и значения, возвращаемого выражением.
Вставка результата запроса
Приведем упрощенный синтаксис команды INSERT:
INSERT [ INTO]
<имя_таблицы>
{ [ (<список_колонок>) ]
{ VALUES
( { DEFAULT | NULL | <выражение> } [, ..., n] )
| <результирующая_таблица>
}
}
| DEFAULTVALUES
Рассмотрим назначение каждого из аргументов:
INTO - дополнительное ключевое слово, которое может быть использовано между словом INSERT и именем таблицы для обозначения, что следующий параметр является именем таблицы, в которую будут вставлены данные;
<имя_таблицы> - имя таблицы, в которую необходимо вставить данные;
<список_столбцов> - содержит список столбцов, в которые будет производиться вставка данных. Если он опущен, то данные будут вставляться последовательно во все столбцы, начиная с первого. Значения для столбцов указываются после ключевого слова VALUES. Для каждого столбца должно быть задано выражение, имеющее соответствующий тип данных. Если список столбцов не указан, то количество значений VALUES должно соответствовать количеству столбцов таблицы. Если же список столбцов явно задан, то это определяет порядок значений VALUES (и, соответственно, их типы). Можно не указывать явно значения для столбцов, если для них определено значение по умолчанию или разрешено хранение значений NULL.
VALUES ( { DEFAULT | NULL | <выражение> } [,..., n]) - определяет набор данных, которые будут вставлены в таблицу. Количество аргументов VALUES определяется количеством столбцов в таблице или количеством столбцов в списке (если таковой имеется). Для каждого столбца таблицы можно указать один из трех возможных вариантов:
DEFAULT - будет вставлено значение по умолчанию, определенное для столбца. Если для столбца разрешено хранение значений NULL, а значение по умолчанию не определено, то в столбец будет вставлено значение NULL.
NULL - в столбец будет вставлено значение NULL. Естественно, вставка таких значений будет успешной, если для столбца была разрешена возможность хранения значений NULL. Следует помнить, что для столбцов, входящих в первичный ключ, возможность хранения значений NULL не предусмотрена.
<выражение> - задает значение, которое будет вставлено в столбец таблицы. Этот параметр должен иметь тот же тип данных, что и столбец, а также удовлетворять ограничениям целостности, определенным для соответствующего столбца.
<результирующая_таблица> - этот параметр подразумевает указание запроса SELECT, с помощью которого будет формироваться набор данных, вставляемых в таблицу. Количество столбцов, порядок их перечисления и их типы данных должны соответствовать столбцам, указанным в списке <список_столбцов>. Если последний отсутствует, то запрос должен возвращать значения для всех столбцов таблицы.
DEFAULTVALUES - при указании этого параметра строка будет содержать только значения по умолчанию. Если для столбца не установлено значение по умолчанию, но разрешено хранение значений NULL, то в столбец будет вставлено значение NULL. Если же для столбца не разрешено хранение значений NULL, нет значения по умолчанию и в команде INSERT не указано значение для вставки, то будет выдано сообщение об ошибке и выполнение команды прервется.
Более сложный случай вставки данных предполагает использование конструкции INSERTINTO...SELECT:
INSERTINTO <имя_таблицы>
SELECT <выражение_запроса>
Аргумент <имя_таблицы> содержит имя таблицы, в которую будут вставляться выбранные данные. Таблица должна иметь соответствующую структуру и быть предварительно создана.
<Выражение_запроса> определяет тело запроса SELECT, с помощью которого производится выборка данных из одной или нескольких таблиц. Например, для выборки данных из таблицы «Студенты» обо всех студентах, поступивших в ВУЗ в 2000 году и сохранения их и таблице «Студент_2000» можно использовать такую последовательность инструкций:
CREATE TABLE Студент_2000
(ID_Студент_2000 INTEGER NOT NULL,
Фамилия CHAR(30) NOT NULL,
Имя CHAR(15) NOT NULL,
Отчество CHAR(20) NOT NULL,
Адрес CHAR(30),
Телефон CHAR(8),
PRIMARY KEY (ID_Студент_2000))
INSERTINTOСтудент_2000
SELECTID_Студент, Фамилия, Имя, Отчество, Адрес, Телефон
FROMСтуденты
WHEREГод_поступления = 2000
После выполнения этой последовательности команд инициируем запрос на отбор строк из новой таблицы:
SELECTTOP 5 Фамилия, Имя, Отчество
FROM Студент_2000
Будет выдан следующий результат:
Приведенный пример иллюстрирует вставку строк данных в таблицу на основе результата выполнения запроса, обращающегося к одной таблице. Более сложные запросы могут обращаться к множеству таблиц одной или нескольких баз данных.
В качестве еще одного примера рассмотрим помещение в новую таблицу «Преполаватель_дисциплина» информации о том, какой преподаватель какую дисциплину ведет.
Для этого мы будем работать с тремя таблицами: «Кадровый_состав», «Учебный_план» и «Дисциплины». В первой таблице содержится список преподавателей, тогда как в третьей — список дисциплин. С помощью таблицы «Учебный_план» устанавливается связь «многие ко многим» между таблицами «Кадровый_состав» и «Дисциплины».
Прежде чем приступать к вставке данных, необходимо создать таблицу, которая будет содержать интересующие нас данные. Помимо столбцов для хранения информации об имени и фамилии преподавателя и названии дисциплины предусмотрим столбцы для хранения идентификационных номеров преподавателей и дисциплин:
CREATETABLE Преподаватель_дисциплина
(ID_Дисциплина INTEGERNOTNULL,
ID_Преподаватель INTEGER NOT NULL,
Наименование CHAR(20) NOT NULL,
Фамилия CHAR(30) NOT NULL,
Имя CHAR(15) NOT NULL,
Отчество CHAR(20) NOT NULL,
Должность CHAR(20) NOTNULL)
Теперь вставим в созданную таблицу нужные нам данные, выполнив для этого следующий запрос:
INSERTINTO Преподаватель_дисциплина
SELECTDISTINCT Дисциплины.ID_Дисциплина,
Кадровый_состав.ID_Преподаватель, Наименование,
Фамилия, Имя, Отчество,Должность
FROMКадровый_состав, Учебный_план, Дисциплины
WHEREКадровый_состав.ID_Преподаватель = Учебный_план.ID_Преподаватель
ANDДисциплины.ID_Дисциплина = Учебный_план.ID_Дисциплина
В результате в таблицу будет вставлено 54 строки.
Проиллюстрируем результат запроса по новой таблице:
SELECTTOP 4 *
FROM Преподаватель_дисциплина