Всем привет! В данной статье речь пойдет о том, как можно добавлять данные в таблицу в Microsoft SQL Server, если Вы уже хоть немного знакомы с языком T-SQL, то наверно поняли, что сейчас мы будем разговаривать об инструкции INSERT, а также о том, как ее можно использовать для добавления данных в таблицу.

Начнем по традиции с небольшой теории.

Инструкция INSERT в T-SQL

INSERT – это инструкция языка T-SQL, которая предназначена для добавления данных в таблицу, т.е. создания новых записей. Данную инструкцию можно использовать как для добавления одной строки в таблицу, так и для массовой вставки данных. Для выполнения инструкции INSERT требуется разрешение на вставку данных (INSERT ) в целевую таблицу.

Существует несколько способов использования инструкции INSERT в части данных, которые необходимо вставить:

  • Перечисление конкретных значений для вставки;
  • Указание набора данных в виде запроса SELECT;
  • Указание набора данных в виде вызова процедуры, которая возвращает табличные данные.

Упрощённый синтаксис

INSERT [таблица] (список столбцов, … ) VALUES (список значений, … ) Или SELECT запрос на выборку Или EXECUTE процедура

  • INSERT INTO – это команда добавления данных в таблицу;
  • Таблица – это имя целевой таблицы, в которую необходимо вставить новые записи;
  • Список столбцов – это перечень имен столбцов таблицы, в которую будут вставлены данные, разделенные запятыми;
  • VALUES – это конструктор табличных значений , с помощью которого мы указываем значения, которые будем вставлять в таблицу;
  • Список значений – это значения, которые будут вставлены, разделенные запятыми. Они перечисляются в том порядке, в котором указаны столбцы в списке столбцов;
  • SELECT – это запрос на выборку данных для вставки в таблицу. Результирующий набор данных, который вернет запрос, должен соответствовать списку столбцов;
  • EXECUTE – это вызов процедуры на получение данных для вставки в таблицу. Результирующий набор данных, который вернет хранимая процедура, должен соответствовать списку столбцов.

Вот примерно так и выглядит упрощённый синтаксис инструкции INSERT INTO, в большинстве случаев именно так Вы и будете добавлять новые записи в таблицы.

Список столбцов, в которые Вы будете вставлять данные, можно и не писать, в таком случае их порядок будет определен на основе фактического порядка столбцов в таблице. При этом необходимо помнить этот порядок, когда Вы будете указывать значения для вставки или писать запрос на выборку. Лично я Вам рекомендую все-таки указывать список столбцов, в которые Вы планируете добавлять данные.

Также следует помнить и то, что в списке столбцов и в списке значений, соответственно, должны присутствовать так называемые обязательные столбцы, это те, которые не могут содержать значение NULL. Если их не указать, и при этом у столбца отсутствует значение по умолчанию, будет ошибка.

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

Хватит теории, переходим к практике.

Исходные данные

Для того чтобы добавлять данные в таблицу, нам нужна соответственно сама таблица, давайте ее создадим, и уже в нее будем пробовать добавлять записи.

Примечание! Все примеры будут выполнены в Microsoft SQL Server 2016 Express .

CREATE TABLE TestTable( IDENTITY(1,1) NOT NULL, (100) NOT NULL, NOT NULL)

Наша тестовая таблица, будет содержать перечень товаров с ценой.

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

CREATE PROCEDURE TestProcedure AS BEGIN SELECT ProductName, Price FROM TestTable END

Для примера она у нас будет возвращать данные из только что созданной таблицы TestTable.

Примечание!

Как Вы понимаете, чтение данного материала подразумевает наличные определенных знаний по языку T-SQL, поэтому если Вам что-то непонятно, рекомендую ознакомиться со следующими материалами:

Пример 1 – Добавляем новую запись в таблицу с использованием конструктора табличных значений

Сначала давайте попробуем добавить одну запись и сразу посмотрим на результат, т.е. напишем запрос на выборку.

INSERT INTO TestTable(ProductName, Price) VALUES ("Компьютер", 100) GO SELECT * FROM TestTable

Вы видите, что мы после названия таблицы перечислили через запятую имена столбцов, в которые мы будем добавлять данные, затем мы указали ключевое слово VALUES и в скобочках также, в том же порядке, через запятую написали значения, которые мы хотим вставить.

После инструкции INSERT я написал инструкцию SELECT и разделил их командой GO.

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

INSERT INTO TestTable(ProductName, Price) VALUES ("Компьютер", 100), ("Клавиатура", 20), ("Монитор", 50) GO SELECT * FROM TestTable


Пример 2 – Добавляем новые строки в таблицу с использованием запроса SELECT

Очень часто возникает необходимость добавлять много данных в таблицу, например, на основе запроса на выборку, т.е. SELECT. Для этого вместо VALUES нам всего лишь нужно указать запрос.

INSERT INTO TestTable(ProductName, Price) SELECT ProductName, Price FROM TestTable WHERE Id >


В данном примере мы написали запрос SELECT, который возвращает данные из таблицы TestTable, но не все, а только те, у которых идентификатор больше 2. А результат вставили все в ту же таблицу TestTable.

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

INSERT INTO TestTable SELECT ProductName, Price FROM TestTable WHERE Id > 2 GO SELECT * FROM TestTable


В данном случае мы уверены в том, что в таблице TestTable первый столбец это ProductName, а второй Price, поэтому мы можем позволить себе написать именно так. Но, снова повторюсь, на практике лучше указывать список столбцов.

Если Вы заметили, я во всех примерах не указывал столбец Id, а он у нас есть, ошибки не возникло, так как данный столбец со свойством IDENTITY, он автоматически генерирует идентификаторы, поэтому в такой столбец вставить данные просто не получится.

Пример 3 – Добавляем новые записи в таблицу с использованием хранимой процедуры

Сейчас давайте вставим в таблицу данные, которые нам вернёт хранимая процедура. Смысл здесь такой же, вместо VALUES и вместо запроса мы указываем вызов процедуры. Но как Вы понимаете, порядок и количество столбцов, возвращаемых процедурой, должен строго совпадать со списком столбцов для вставки (даже если список столбцов не указан ).

INSERT INTO TestTable(ProductName, Price) EXEC TestProcedure GO SELECT * FROM TestTable


Надеюсь, данный материал помог Вам разобраться с инструкцией INSERT INTO , а у меня все, пока!

С помощью SQL можно скопировать информацию из одной таблицы в другую.

INSERT INTO SELECT, заявление копирует данные из одной таблицы и вставляет его в существующую таблицу.

Заявление SQL INSERT INTO SELECT,

INSERT INTO SELECT, оператор выбирает данные из одной таблицы и вставляет его в существующую таблицу. Любые существующие строки в целевой таблице не изменяются.

SQL INSERT INTO SELECT, Синтаксис

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

INSERT INTO table2
SELECT * FROM table1;

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

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

Демо-версия базы данных

В этом уроке мы будем использовать хорошо известную базу данных Борей.

Ниже приводится подборка из "Customers" таблицы:

Пользовательский ИД Имя Клиента Контактное лицо Адрес город Почтовый индекс Страна
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitucion 2222 Mexico D.F. 05021 Mexico
3 Antonio Moreno Taqueria Antonio Moreno Mataderos 2312 Mexico D.F. 05023 Mexico

И выбор из "Suppliers" таблицы:

SQL INSERT INTO SELECT, Примеры

Копирование только несколько столбцов из "Suppliers" Into "Customers" :

Копирование только немецких поставщиков в "Customers" .

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

Синтаксис оператора следующий:

    INSERT INTO [ (,...) ]

    { VALUES (,…) }

  1. | { DEFAULT VALUES }

Как видно из представленного синтаксиса, список столбцов не является обязательным (об этом говорят квадратные скобки в описании синтаксиса). В том случае, если он отсутствует, список вставляемых значений должен быть полный, то есть обеспечивать значения для всех столбцов таблицы. При этом порядок значений должен соответствовать порядку, заданному оператором CREATE TABLE для таблицы, в которую вставляются строки. Кроме того, эти значения должны относиться к тому же типу данных, что и столбцы, в которые они вносятся. В качестве примера рассмотрим вставку строки в таблицу Product, созданную следующим оператором CREATE TABLE :

    CREATE TABLE product

    maker char (1 ) NOT NULL ,

    model varchar (4 ) NOT NULL ,

    type varchar (7 ) NOT NULL

Пусть требуется добавить в эту таблицу модель ПК 1157 производителя B. Это можно сделать следующим оператором:

    INSERT INTO Product

    VALUES ("B" , 1157 , "PC" ) ;

Если задать список столбцов, то можно изменить «естественный» порядок их следования:

    INSERT INTO Product (type, model, maker)

    VALUES ("PC" , 1157 , "B" ) ;

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

    CREATE TABLE product_D

    maker char (1 ) NULL ,

    model varchar (4 ) NULL ,

    type varchar (7 ) NOT NULL DEFAULT "PC"

Отметим, что здесь значения всех столбцов имеют значения по умолчанию (первые два - NULL, а последний столбец - type - PC). Теперь мы могли бы написать:

    INSERT INTO Product_D (model, maker)

    VALUES (1157 , "B" ) ;

В этом случае отсутствующее значение при вставке строки будет заменено значением по умолчанию - PC. Заметим, что если для столбца в операторе CREATE TABLE не указано значение по умолчанию и не указано ограничение NOT NULL , запрещающее использование NULL в данном столбце таблицы, то подразумевается значение по умолчанию NULL .

Возникает вопрос: а можно ли не указывать список столбцов и, тем не менее, воспользоваться значениями по умолчанию? Ответ положительный. Для этого нужно вместо явного указания значения использовать зарезервированное слово DEFAULT :

    INSERT INTO Product_D

    VALUES ("B" , 1158 , DEFAULT ) ;

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

    INSERT INTO Product_D

    VALUES (DEFAULT , DEFAULT , DEFAULT ) ;

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

    INSERT INTO Product_D DEFAULT VALUES ;

Заметим, что при вставке строки в таблицу проверяются все ограничения, наложенные на данную таблицу. Это могут быть ограничения первичного ключа или уникального индекса, проверочные ограничения типа CHECK , ограничения ссылочной целостности. В случае нарушения какого-либо ограничения вставка строки будет отклонена. Рассмотрим теперь случай использования подзапроса. Пусть нам требуется вставить в таблицу Product_D все строки из таблицы Product, относящиеся к моделям персональных компьютеров (type = ‘PC’). Поскольку необходимые нам значения уже имеются в некоторой таблице, то формирование вставляемых строк вручную, во-первых, является неэффективным, а, во-вторых, может допускать ошибки ввода. Использование подзапроса решает эти проблемы:

Использование в подзапросе символа «*» является в данном случае оправданным, так как порядок следования столбцов является одинаковым для обеих таблиц. Если бы это было не так, следовало бы применить список столбцов либо в операторе INSERT , либо в подзапросе, либо в обоих местах, который приводил бы в соответствие порядок следования столбцов:

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

В данном случае в столбец type таблицы Product_D будет подставлено значение по умолчанию PC для всех вставляемых строк.

Отметим, что при использовании подзапроса, содержащего предикат, будут вставлены только те строки, для которых значение предиката равно TRUE (не UNKNOWN !). Другими словами, если бы столбец type в таблице Product допускал бы NULL -значение, и это значение присутствовало бы в ряде строк, то эти строки не были бы вставлены в таблицу Product_D.

Преодолеть ограничение на вставку одной строки в операторе INSERT при использовании конструктора строки в предложении VALUES позволяет искусственный прием использования подзапроса, формирующего строку с предложением UNION ALL . Так если нам требуется вставить несколько строк при помощи одного оператора INSERT , можно написать:

    INSERT INTO Product_D

    SELECT "B" AS maker, 1158 AS model, "PC" AS type

    UNION ALL

    SELECT "C" , 2190 , "Laptop"

    UNION ALL

    SELECT "D" , 3219 , "Printer" ;

Использование UNION ALL предпочтительней UNION даже, если гарантировано отсутствие строк-дубликатов, так как в этом случае не будет выполняться проверка для исключения дубликатов.

Следует отметить, что вставка нескольких кортежей с помощью конструктора строк уже реализована в Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) - универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server 2008. С учетом этой возможности, последний запрос можно переписать в виде:

    INSERT INTO Product_D VALUES

    ("B" , 1158 , "PC" ) ,

    ("C" , 2190 , "Laptop" ) ,

Команда добавляет строки в таблицу или представление основной таблицы.

Синтаксис команды Sql INSERT

Синтаксис команды Insert


Основные ключевые слова и параметры команды INSERT
  • schema - идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
  • table view - имя таблицы, в которую строки должны быть вставлены; если указано представление, то строки вставляются в основную таблицу представления
  • subquery_1 - подзапрос, который сервер обрабатывает тем же самым способом как представление
  • column - столбец таблицы или представления, в который для каждой вставленной строки вводится значение из фразы VALUES или подзапроса; если один из столбцов таблицы опускается из этого списка, значением столбца для вставленной строки является значение по умолчанию столбца, определенное при создании таблицы. Если полностью опускается список столбца, предложение VALUES или запрос должен определить значения для всех столбцов в таблице
  • VALUES - определяет строку значений, которые будут вставлены в таблицу или представление; значение должно быть определено в предложении VALUES для каждого столбца в списке столбцов
  • subquery_2 - подзапрос, который возвращает строки, вставляемые в таблицу; выборочный список этого подзапроса должен иметь такое же количество столбцов, как в списке столбцов утверждения

Утверждение с фразой VALUES добавляет одиночную строку к таблице. Эта строка содержит значения, определенные фразой VALUES .
Утверждение с подзапросом вместо фразы VALUES добавляет к таблице все строки, возвращенные подзапросом. Сервер обрабатывает подзапрос и вставляет каждую возвращенную строку в таблицу. Если подзапрос не выбирает никакие строки, сервер не вставляет никакие строки в таблицу.
Подзапрос может обратиться к любой таблице или представлению, включая целевую таблицу утверждения . Сервер назначает значения полям в новых строках, основанных на внутренней позиции столбцов в таблице и порядке значений фразы VALUES или в списке выбора запроса. Если какие-либо столбцы пропущены в списке столбцов, сервер назначает им значения по умолчанию, определенные при создании таблицы. Если любой из этих столбцов имеет NOT NULL ограничение то сервер возвращает ошибку, указывающую, что ограничение было нарушено и отменяет утверждение INSERT.
При выдаче утверждения INSERT включается любой INSERT — триггер, определенный на таблице.

INSERT INTO Пример 1

INSERT INTO dept VALUES (50, «ПРОДУКЦИЯ», «САН-ФРАНЦИСКО»);

INSERT INTO Customers (city, cname, cnum) VALUES (‘London’, ‘Hoffman’, 2001);

INSERT INTO Пример 2
Нижеприведенная команда копирует данные сотрудников фирмы, комисионные которых превышают 25% от дохода в таблицу bonus:

INSERT INTO bonus SELECT ename, job, sal, comm FROM emp WHERE comm > 0.25 * sal;

INSERT INTO Пример 3
Если нужно вставить NULL -значение, необходимо указать его как обычное значение следующим образом:

INSERT INTO Salespeople VALUES (1001,’Peel’,NULL,12);

INSERT INTO Пример 4
Команду можно применить для того, чтобы извлечь значения из одной таблицы и разместить их в другой, воспользовавшись для этого запросом. Для этого достаточно заменить предложение VALUES на соответствующий запрос:

INSERT INTO Londonstaff SELECT * FROM Salespeople WHERE city = ‘London’;

MySQL INSERT

Для вставки новых строк в базу данных MySQL используется команда INSERT , примеры команды приведены ниже:
INSERT INTO Пример 1.
Вставка новой строки в таблицу table_name.

INSERT INTO

INSERT INTO Пример 2.
Вставка новой строки в таблицу table_name с указанием вставки данных в нужные нам колонки.

INSERT INTO table_name VALUES (‘1′,’165′,’0′,’name’);

В базе данных MySQL имеется возможность вставлять множество новых строк, используя одну команду .
INSERT INTO Пример 3.
Вставка несколько строк в таблицу table_name.

INSERT INTO table_name (tbl_id, chislo, chislotwo, name) VALUES (‘1′,’159′,’34’,’name1′), (‘2′,’14’,’61’,’name2′), (‘3′,’356′,’8′,’name3’);

Последнее обновление: 13.07.2017

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

INSERT имя_таблицы [(список_столбцов)] VALUES (значение1, значение2, ... значениеN)

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

Например, пусть ранее была создана следующая база данных:

CREATE DATABASE productsdb; GO USE productsdb; CREATE TABLE Products (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL)

Добавим в нее одну строку с помощью команды INSERT:

INSERT Products VALUES ("iPhone 7", "Apple", 5, 52000)

После удачного выполнения в SQL Server Management Studio в поле сообщений должно появиться сообщение "1 row(s) affected":

Стоит учитывать, что значения для столбцов в скобках после ключевого слова VALUES передаются по порядку их объявления. Например, в выражении CREATE TABLE выше можно увидеть, что первым столбцом идет Id. Но так как для него задан атрибут IDENTITY, то значение этого столбца автоматически генерируется, и его можно не указывать. Второй столбец представляет ProductName, поэтому первое значение - строка "iPhone 7" будет передано именно этому столбцу. Второе значение - строка "Apple" будет передана третьему столбцу Manufacturer и так далее. То есть значения передаются столбцам следующим образом:

    ProductName: "iPhone 7"

    Manufacturer: "Apple"

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

INSERT INTO Products (ProductName, Price, Manufacturer) VALUES ("iPhone 6S", 41000, "Apple")

Здесь значение указывается только для трех столбцов. Причем теперь значения передаются в порядке следования столбцов:

    ProductName: "iPhone 6S"

    Manufacturer: "Apple"

Для неуказанных столбцов (в данном случае ProductCount) будет добавляться значение по умолчанию, если задан атрибут DEFAULT, или значение NULL. При этом неуказанные столбцы должны допускать значение NULL или иметь атрибут DEFAULT.

Также мы можем добавить сразу несколько строк:

INSERT INTO Products VALUES ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)

В данном случае в таблицу будут добавлены три строки.

Также при добавлении мы можем указать, чтобы для столбца использовалось значение по умолчанию с помощью ключевого слова DEFAULT или значение NULL:

INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price) VALUES ("Mi6", "Xiaomi", DEFAULT, 28000)

В данном случае для столбца ProductCount будет использовано значение по умолчанию (если оно установлено, если его нет - то NULL).

Если все столбцы имеют атрибут DEFAULT, определяющий значение по умолчанию, или допускают значение NULL, то можно для всех столбцов вставить значения по умолчанию:

INSERT INTO Products DEFAULT VALUES

Но если брать таблицу Products, то подобная команда завершится с ошибкой, так как несколько полей не имеют атрибута DEFAULT и при этом не допускают значение NULL.