SQL оператор INSERT INTO SELECT. SQL заявка INSERT INTO - попълване на базата данни с информация Синтаксис на Sql команда за вмъкване на ред

24.03.2023

Използвайки SQL, можете да копирате информация от една таблица в друга.

Операторът INSERT INTO SELECT копира данни от една таблица и ги вмъква в съществуваща таблица.

SQL оператор INSERT INTO SELECT,

Операторът INSERT INTO SELECT избира данни от една таблица и ги вмъква в съществуваща таблица. Всички съществуващи редове в целевата таблица не се променят.

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

Можем да копираме всички колони от една таблица в друга съществуваща таблица:

INSERT INTO таблица2
ИЗБЕРЕТЕ * ОТ маса 1;

Или можем само да копираме колоните, които искаме, в друга съществуваща таблица:

INSERT INTO таблица2
(имена_на_колони)
ИЗБЕРЕТЕ име(на) на колони
ОТ маса 1;

Демо база данни

В този урок ще използваме добре познатата база данни Northwind.

По-долу има избор от таблицата „Клиенти“:

Потребителско имеиме на клиентаЛицето за контактАдресградПощенски кодСтрана
1 Алфред Футеркисте Мария Андерс Обере ул. 57 Берлин 12209 Германия
2 Ана Трухильо Емпаредадос и хеладос Ана Трухильо Avda. de la Constitucion 2222 Мексико D.F. 05021 Мексико
3 Антонио Морено Такериа Антонио Морено Матадерос 2312 Мексико D.F. 05023 Мексико

И избор от таблицата "Доставчици":

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

Копиране само на няколко колони от „Доставчици“ в „Клиенти“:

Копирайте само немски доставчици в "Клиенти" .

Последна актуализация: 13.07.2017

За добавяне на данни се използва командата INSERT, която има следния формален синтаксис:

INSERT table_name [(списък_колони)] СТОЙНОСТИ (стойност1, стойност2, ... стойностN)

В началото има оператор INSERT INTO, след това в скоби можете да посочите списък от колони, разделени със запетаи, в които да се добавят данни, а в края, след думата VALUES, в скоби, стойностите ​да се добавят за колоните са изброени.

Например, да кажем, че следната база данни е създадена по-рано:

СЪЗДАВАНЕ НА БАЗА ДАННИ productsdb; ИЗПОЛЗВАЙТЕ productsdb; СЪЗДАВАНЕ НА ТАБЛИЦА Продукти (Id INT ИДЕНТИТИЧЕН ПРАВИНЕН КЛЮЧ, Име на продукта NVARCHAR(30) NOT NULL, Производител NVARCHAR(20) NOT NULL, ProductCount INT ПО ПОДРАЗБИРАНЕ 0, Цена ПАРИ НЕ NULL)

Нека добавим един ред към него с помощта на командата INSERT:

ВМЪКНЕТЕ Продукти СТОЙНОСТИ ("iPhone 7", "Apple", 5, 52000)

След успешно изпълнение в SQL Server Management Studio в полето за съобщения трябва да се появи съобщението „1 ред(а) засегнати“:

Имайте предвид, че стойностите за колоните в скоби след ключовата дума VALUES се предават в реда, в който са декларирани. Например в оператора CREATE TABLE по-горе можете да видите, че първата колона е Id. Но тъй като атрибутът IDENTITY е зададен за него, стойността на тази колона се генерира автоматично и може да бъде пропусната. Втората колона представлява ProductName, така че първата стойност, низът „iPhone 7“, ще бъде предадена на тази колона. Втората стойност, низът „Apple“, ще бъде предадена на третата колона Manufacturer и т.н. Тоест стойностите се предават на колоните, както следва:

    Име на продукта: "iPhone 7"

    Производител: Apple

Освен това, когато въвеждате стойности, можете да посочите непосредствените колони, в които ще се добавят стойности:

INSERT INTO Продукти (Име на продукта, цена, производител) СТОЙНОСТИ ("iPhone 6S", 41000, "Apple")

Тук стойността е посочена само за три колони. И сега стойностите се предават в реда на колоните:

    Име на продукта: "iPhone 6S"

    Производител: Apple

За неуточнени колони (в този случай ProductCount) ще бъде добавена стойност по подразбиране, ако е зададен атрибутът DEFAULT или NULL. Въпреки това, неуточнените колони трябва да са nullable или да имат атрибут DEFAULT.

Можем също да добавим няколко реда наведнъж:

ВМЪКНЕТЕ В СТОЙНОСТИ НА ПРОДУКТИ ("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) STOYS ("Mi6", "Xiaomi", ПО ПОДРАЗБИРАНЕ, 28000)

В този случай стойността по подразбиране ще се използва за колоната ProductCount (ако е зададена, ако не, тогава NULL).

Ако всички колони имат атрибут DEFAULT, който дефинира стойност по подразбиране, или са nullable, тогава можете да вмъкнете стойности по подразбиране за всички колони:

ВМЪКНЕТЕ В СТОЙНОСТИТЕ ПО ПОДРАЗБИРАНЕ НА Продукти

Но ако вземете таблицата "Продукти", тогава такава команда ще се провали, тъй като няколко полета нямат атрибут DEFAULT и в същото време не позволяват нулеви стойности.

В предишните раздели разгледахме работата по получаване на данни от предварително създадени таблици. Сега е време да разберем как можем да създаваме/изтриваме таблици, да добавяме нови записи и да изтриваме стари. За тези цели в SQLима оператори като: СЪЗДАВАЙТЕ- създава таблица АЛТЕР- променя структурата на таблицата, ИЗПУСКАЙТЕ- изтрива таблица или поле, ВМЪКНЕТЕ- добавя данни към таблицата. Нека започнем нашето запознанство с тази група оператори от оператора ВМЪКНЕТЕ.

1. Добавяне на цели линии

Както подсказва името, операторът ВМЪКНЕТЕизползва се за вмъкване (добавяне) на редове към таблица на база данни. Добавянето може да стане по няколко начина:

  • - добавете един пълен ред
  • - добавяне на част от низ
  • - добавяне на резултати от заявка.

И така, за да добавим нов ред към таблицата, трябва да посочим името на таблицата, да изброим имената на колоните и да посочим стойността за всяка колона с помощта на конструкцията INSERT INTO име_на_таблица (поле1, поле2 ...) СТОЙНОСТИ (стойност1, стойност2 ...). Нека разгледаме един пример.

ВМЪКНЕТЕ В СТОЙНОСТИ на продавачи (ИД, адрес, град, име на продавача, държава).("6", "1-ва улица", "Лос Анджелис", "Хари Монро", "САЩ")

Можете също да промените реда на имената на колоните, но в същото време трябва да промените реда на стойностите в параметъра СТОЙНОСТИ.

2. Добавяне на част от линиите

В предишния пример, когато използвате оператора ВМЪКНЕТЕние изрично маркирахме имената на колоните в таблицата. Използвайки този синтаксис, можем да пропуснем някои колони. Това означава, че въвеждате стойност за някои колони, но не предоставяте стойности за други. Например:

ВМЪКНЕТЕ В СТОЙНОСТИ на продавачи (ID, град, име на продавача).("6", "Лос Анджелис", "Хари Монро")

В този пример не сме посочили стойност за две колони адресИ Държава. Можете да изключите някои колони от извлечението INSERT INTO, ако позволява дефинирането на таблицата. В този случай трябва да бъде изпълнено едно от следните условия: тази колона е дефинирана като позволяваща стойността НУЛА(липса на каквато и да е стойност) или в дефиницията на таблицата посочената стойност по подразбиране. Това означава, че ако не е зададена стойност, ще се използва стойността по подразбиране. Ако пропуснете колона в таблица, която не позволява стойности в своите редове НУЛАи няма дефинирана стойност по подразбиране, СУБД ще издаде съобщение за грешка и този ред няма да бъде добавен.

3. Добавяне на избрани данни

В предишните примери вмъкнахме данни в таблици, като ги написахме ръчно в заявката. Операторът обаче INSERT INTOни позволява да автоматизираме този процес, ако искаме да вмъкнем данни от друга таблица. За да направи това, SQL има структура като тази: ВМЪКНЕТЕ В ... ИЗБЕРЕТЕ .... Този дизайн ви позволява едновременно да избирате данни от една таблица и да ги вмъквате в друга. Да предположим, че имаме друга маса Продавачи_ЕСсъс списък на продавачите на нашите стоки в Европа и трябва да ги добавим към общата таблица Продавачи. Структурата на тези таблици е еднаква (един и същи брой колони и еднакви имена), но различни данни. За да направим това, можем да напишем следната заявка:

INSERT INTO Продавачи (ИД, адрес, град, име на продавача, държава) ИЗБЕРЕТЕИдентификационен номер, адрес, град, име на продавача, държава FROM Sellers_EU

Трябва да обърнете внимание, че стойността на вътрешните ключове не се повтаря (поле документ за самоличност), в противен случай ще възникне грешка. Оператор ИЗБЕРЕТЕможе да включва и предложения КЪДЕТОза филтриране на данни. Трябва също да се отбележи, че СУБД не обръща внимание на имената на колоните, съдържащи се в израза ИЗБЕРЕТЕ, за нея е важен само редът на подреждането им. Следователно данните в първата посочена колона, която е избрана поради ИЗБЕРЕТЕ, така или иначе ще се попълни първата колона на таблицата Продавачипосочени след оператора INSERT INTO, независимо от името на полето.

4. Копиране на данни от една таблица в друга

Често при работа с бази данни става необходимо да се създават копия на всякакви таблици с цел архивиране или модификация. За да направите пълно копие на таблица в SQL, се предоставя отделен оператор ИЗБЕРЕТЕ В. Например, трябва да създадем копие на таблицата Продавачи, ще трябва да напишете заявката, както следва:

ИЗБЕРЕТЕ * INTO Sellers_new FROM Sellers

За разлика от предишния дизайн ВМЪКНЕТЕ В ... ИЗБЕРЕТЕ ...когато се добавят данни към съществуваща таблица, конструкцията копира данните в новата таблица. Може също да се каже, че първият конструкт импортира данни, докато вторият конструкт експортира. При използване на структурата ИЗБЕРЕТЕ ... В ... ОТ ...трябва да се вземе предвид следното:

  • - можете да използвате всякакви изречения в оператора ИЗБЕРЕТЕ, като ГРУПИРАЙ ПОИ ИМАЩ
  • - присъединяването може да се използва за добавяне на данни от множество таблици
  • - данни могат да се добавят само към една таблица, независимо от колко таблици са взети.

Този оператор добавя един или повече записи към таблицата (извършва заявка за добавяне).

Синтаксис

Заявка за добавяне на множество записи:

INSERT INTO целеви_обект [(поле1[, поле2[, ...]])]
ИЗБЕРЕТЕ[ източник.]поле1[, поле2[, ...]
ОТ табличен_израз

Заявка за добавяне на един запис:

INSERT INTO целеви_обект [(поле1[, поле2[, ...]])]
СТОЙНОСТИ ( поле1[, поле2[, ...])

Операторът INSERT INTO се състои от следните елементи:

Част

Описание

целеви_обект

Името на таблицата или заявката, където се добавят записите.

поле1, поле2

След спора целеви_обект- имената на полетата, към които се добавят данните; след спора източник- имената на полетата, от които се извличат данните.

външна_база_данни

Път до външна база данни. За описание на пътя вижте статията за клаузата IN.

източник

Името на таблицата или заявката, откъдето се копират записите.

табличен_израз

Едно или повече имена на таблици, от които да се извличат записи. Този аргумент може да бъде едно име на таблица, резултат от израз INNER JOIN, LEFT JOIN или RIGHT JOIN или запазена заявка.

стойност1, стойност2

Стойности, които трябва да се добавят към конкретни полета в новия запис. Всяка стойност се вмъква в полето, съответстващо на нейната позиция в списъка: стойност1добавен към поле1нов запис, стойност2- В поле2и т.н. Трябва да разделите стойностите със запетая и да поставите текстовите полета в кавички (" ").

Забележки

Оператор INSERT INTO може да добави единичен запис към таблица, използвайки горния синтаксис. В този случай имената и стойностите са посочени за всяко поле на записа. Трябва да посочите всички полета на записа, на които са присвоени стойности и съответните им стойности. Ако не посочите стойност на полето, ще му бъде присвоена стойност по подразбиране или NULL. Записите се добавят в края на таблицата.

Можете също да използвате израза INSERT INTO, за да добавите набор от записи от друга таблица или заявка, като използвате клаузата SELECT... FROM, както е показано по-горе (вижте Синтаксис на заявка за множество записи). В този случай клаузата SELECT указва полетата, които да се добавят към указаното целеви_обект.

Източникили целеви_обектможе да бъде таблица или заявка. Когато се даде заявка, механизмът на базата данни на Microsoft Access добавя записи към всички таблици, които връща.

Използването на оператора INSERT INTO не е задължително. Ако присъства, трябва да предшества израза SELECT.

Ако целевата таблица съдържа първичен ключ, уверете се, че стойностите, добавени към едно или повече полета за първичен ключ, са уникални и различни от НУЛА; в противен случай няма да се добавят записи.

Ако записите се добавят към таблица с поле за брой и искате да ги преномерирате, не включвайте полето за брой в заявката. Включете полето "Брояч" в заявката, ако искате да запазите оригиналните стойности от полето.

Можете да добавяте записи към таблица в друга база данни, като използвате клаузата IN.

За да създадете таблица, използвайте израза SELECT... INTO, за да получите заявка за създаване на таблица.

Преди да стартирате заявка за добавяне, използвайте заявка за избор със същите критерии за избор, за да определите кои записи ще бъдат добавени въз основа на резултатите.

Заявката за добавяне копира записи от една или повече таблици в друга таблица. В същото време таблиците, съдържащи добавените записи, остават непроменени.

Вместо да добавяте записи от друга таблица, можете да зададете стойността на всяко поле в отделен нов запис, като използвате клаузата VALUES. Ако списъкът с полета е пропуснат, клаузата VALUES трябва да включва съответните стойности за всяко поле в таблицата; в противен случай операцията INSERT ще бъде неуспешна. Използвайте оператора INSERT INTO заедно с клаузата VALUES за всеки допълнителен запис, който искате да създадете.

В допълнение към оператора SELECT, обсъден по-рано, езикът за манипулиране на данни (DML) съдържа три други оператора: INSERT, UPDATE и DELETE. Подобно на оператора SELECT, тези три оператора работят върху таблици или изгледи. Тази статия се занимава с оператора INSERT, а другите два оператора се обсъждат в следващата статия.

INSERT Изявлениевмъква редове (или части от редове) в таблица. Има две различни форми на тази инструкция:

ВМЪКНЕТЕ име на_таб_[(кола_списък)] СТОЙНОСТИ ПО ПОДРАЗБИРАНЕ | СТОЙНОСТИ (( ПО ПОДРАЗБИРАНЕ | NULL | израз ) [ ,...n]) INSERT INTO tab_name | име_на_изглед [(кола_списък)] (избор_инструкция | изпълни_инструкция) Синтаксис

Първата форма на оператора ви позволява да вмъкнете един ред (или част от него) в таблицата. А втората форма на израза INSERT ви позволява да вмъкнете в таблицата резултатния набор от оператор SELECT или съхранена процедура, изпълнена от оператор EXECUTE. Съхранената процедура трябва да върне данни, които да бъдат вмъкнати в таблицата. Когато се използва с оператор INSERT, операторът SELECT може да избира стойности от различна или същата таблица, в която се вмъкват данните, стига типовете данни на съответните колони да са съвместими.

И за двата формуляра типът данни на всяка вмъкната стойност трябва да е съвместим с типа данни на съответната колона на таблицата. Всички низови и временни данни трябва да бъдат оградени в кавички; Числовите стойности не е необходимо да бъдат поставени в кавички.

Вмъкване на един ред

И за двете форми на оператора INSERT изричният списък от колони не е задължителен. Липсата на списък с колони е еквивалентна на посочване на всички колони на таблицата.

Параметър СТОЙНОСТИ ПО ПОДРАЗБИРАНЕвмъква стойности по подразбиране за всички колони. Колоните с тип данни TIMESTAMP или свойство IDENTITY се вмъкват по подразбиране със стойности, автоматично генерирани от системата. За колони с други типове данни се вмъква съответната ненулева стойност по подразбиране, ако има такава, или NULL в противен случай. Ако нулевите стойности не са разрешени за колона и не е дефинирана стойност по подразбиране за колоната, операторът INSERT е неуспешен и се показва подходящо съобщение.

Следният пример вмъква редове в таблицата Employee в базата данни SampleDb, демонстрирайки как да използвате израза INSERT за вмъкване на малко количество данни в базата данни:

ИЗПОЛЗВАЙТЕ SampleDb; INSERT INTO Employee VALUES(34990, "Андрей", "Батонов", "d1"); INSERT INTO Employee VALUES(38640, "Aleksey", "Vasin", "d3");

Има два различни начина за вмъкване на стойности в нов ред. Операторът INSERT в примера по-долу изрично използва ключовата дума NULL и вмъква стойността NULL в съответната колона:

ИЗПОЛЗВАЙТЕ SampleDb; INSERT INTO Employee VALUES(34991, "Андрей", "Батонов", NULL);

За да вмъкнете стойности в някои (но не всички) колони на таблица, обикновено трябва изрично да посочите тези колони. Колоните, които не са посочени, трябва или да позволяват NULL стойности или трябва да имат дефинирана стойност по подразбиране за тях.

ИЗПОЛЗВАЙТЕ SampleDb; INSERT INTO Employee(Id, FirstName, LastName) VALUES (34992, "Андрей", "Батонов");

Предишните два примера са еквивалентни. В таблицата Employee единствената колона, която позволява нулеви стойности, е колоната DepartmentNumber, а за всички останали колони тази стойност е забранена от клаузата NOT NULL в оператора CREATE TABLE.

Ред на стойностите в изречение ЦЕННОСТИОператорите INSERT може да се различават от реда, указан в оператора CREATE TABLE. В такъв случай техният ред трябва да съвпада с реда, в който съответните колони са изброени в списъка с колони. Следното е пример за вмъкване на данни в ред, различен от оригинала:

ИЗПОЛЗВАЙТЕ SampleDb; INSERT INTO Employee(DepartamentNumber, LastName, Id, FirstName) VALUES ("d1", "Батонов", 34993, "Андрей");

Вмъкване на няколко реда

Втората форма на оператора INSERT вмъква в таблицата един или повече редове, избрани от подзаявката. Примерът по-долу показва как да вмъкнете редове в таблица, като използвате втората форма на израза INSERT. В този случай се извършва заявка за избор на номерата и имената на отделите, разположени в Москва, и зареждането на получения набор в нова таблица, създадена по-рано.

Новата таблица MoscowDepartment, създадена в примера по-горе, има същите колони като съществуващата таблица Department, с изключение на липсващата колона Location. Подзаявката в израза INSERT избира всички редове в таблицата Department, за които стойността на колоната Location е Москва, които след това се вмъкват в новата таблица, създадена в началото на заявката.

Примерът по-долу показва друг начин за вмъкване на редове в таблица с помощта на втората форма на израза INSERT. В този случай се изпълнява заявка за извличане на персонални номера, номера на проекти и начални дати на проекта за всички служители с позиция „Мениджър“, които работят по проекта p2, и след това зареждане на получения набор в нова таблица, създадена в началото на заявката:

ИЗПОЛЗВАЙТЕ SampleDb; CREATE TABLE ManagerTeam(EmpId INT NOT NULL, ProjectNumber CHAR(4) NOT NULL, EnterDate DATE); INSERT INTO ManagerTeam(EmpId, ProjectNumber, EnterDate) SELECT EmpId, ProjectNumber, EnterDate FROM Works_on WHERE Job = "Manager";

Преди вмъкване на редове с помощта на оператора INSERT, таблиците MoscowDepartment и ManagerTeam (в примерите по-горе) бяха празни. Ако таблицата вече съществува и съдържа редове с данни, тогава към нея ще бъдат добавени нови редове.