Оператор INSERT в стандарте SQL-92 имеет следующее формальное описание:
INSERT INTO table_name
[ (field .,…) ]
{ VALUES (value .,…) }
| subquery
| {DEFAULT VALUES};
Оператор INSERT может добавлять в таблицу как одну, так и несколько строк. Список полей (field .,…) указывает имена полей и порядок занесения в них значений из списка значений, определяемого фразой VALUES, или как результат выполнения подзапроса.
Список, определяемый фразой VALUES, называется конструктором значений таблицы и указывается в круглых скобках через запятую.
Если список полей (field .,…) опущен, то порядок занесения значений будет соответствовать порядку столбцов, указанному в операторе CREATE TABLE при создании данной таблицы.
Если для столбцов, на которые установлено ограничение NOT NULL, не указано добавляемых данных, то СУБД инициирует ошибку выполнения SQL-оператора.
Следующий оператор INSERT демонстрирует копирование строк таблицы tbl2, выполняемое на основе подзапроса:
INSERT INTO tbl1(f1,f2,f3)
(SELECT f1,f2,f3 FROM tbl2);
Очевидно, что количество полей, указываемое списком полей, и типы данных этих полей должны совпадать с количеством полей и их типами данных в конструкторе значений таблицы или в результирующем наборе, формируемом подзапросом.