Вмъкване в синтаксиса. SQL оператор INSERT INTO SELECT. Примери за sql заявка INSERT INTO в MySQL база данни

Използвайки 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 Ана Трухильо Emparedados y helados Ана Трухильо Avda. de la Constitucion 2222 Мексико D.F. 05021 Мексико
3 Антонио Морено Такериа Антонио Морено Матадерос 2312 Мексико D.F. 05023 Мексико

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

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

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

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

sql заявката INSERT INTO има смисъл, когато е създадена таблица на база данни. Тоест таблицата съществува, има име, създадени редове и колони. таблицата се създава от оператора: , таблицата се модифицира от оператора .

sql заявка INSERT INTO - синтаксис на заявка

sql заявката INSERT INTO има следния синтаксис:

INSERT INTO table_name (в скоби, ако е необходимо, вмъкнете списък с колони, където искате да вмъкнете данни) VALUES вмъкнати данни1, вмъкнати данни2, вмъкнати данни3.

Можете да вмъкнете опция IGNORE между INSERT и INTRO. Не е задължително. Необходим за защита на първичните ключове при редактиране на таблица. В противен случай, ако се получи дублиране на първични ключове по време на редактиране, тогава при вмъкване на опцията IGNORE, първият ред с първичния ключ ще остане в таблицата, която се редактира.Другите първични ключове ще бъдат изтрити. По подразбиране пропускаме тази опция.

Има незадължителни опции LOW_PRIORITY и DELAYED. Те определят приоритетите за добавяне на информация към базата данни. Първият указва изчакване базата данни да бъде освободена, вторият означава буфериране на информация.

Редът в заявката: INSERT с фразата VALUES ще ви позволи да добавите един ред към таблицата на базата данни. Клаузата VALUES съдържа стойностите на тези данни.

Подзаявките могат да бъдат зададени вместо фразата VALUES. INSERT с подзаявка добавя към таблицата редовете, върнати от подзаявката. Сървърът на базата данни обработва подзаявката и вмъква всички върнати редове в таблицата. Сървърът не вмъква редове, освен ако подзаявката не ги избере.

  • subquery_1 - подзаявка, която сървърът обработва по същия начин като изгледа
  • subquery_2 е подзаявка, която връща редове, вмъкнати в таблицата. Списъкът на тази подзаявка трябва да има същия брой колони като списъка с колони INSERT.

Подзаявките практически не се използват в MySQL база данни.

Примери за sql заявка INSERT INTO в MySQL база данни

Вмъкваме нови редове в базата данни MySQL с помощта на командата INSERT INTRO.

Първи пример.

Вмъкнете нови редове в таблицата table_name.

INSERT INTO table_name VALUES ('2','145','1','name');

Това означава, че искаме да вмъкнем стойностите 2,145,1,name в колоните на таблицата table_name. Тъй като колоните не са посочени, стойностите се попълват във всички колони на таблицата.

Пример втори.

Вмъкнете информация в необходимите (посочени) колони на таблицата table_name.

INSERT INTO table_name (client_customer, client_subclient, client_mail) VALUES ('name1','subname1',' [имейл защитен]′), ('име2','подиме2',' [имейл защитен]′), ('име3','подиме3',(' [имейл защитен]′);

Игор Серов специално за сайта "".

Последна актуализация: 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" ще бъде предадена на третата колона Производител и т.н. Тоест стойностите се предават на колоните, както следва:

    Име на продукта: "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, можете да вмъкнете стойности по подразбиране за всички колони:

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

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

Какво е INSERT INTO?

Основната цел на системите за бази данни е да съхраняват данни в таблици. Данните обикновено се предоставят от приложни програми, които работят върху базата данни. За тази цел SQL има командата INSERT, която се използва за съхраняване на данни в таблица. The Командата INSERT създава нов редв таблицата за съхраняване на данни.

Основен синтаксис

Нека разгледаме основния синтаксис на командата SQL INSERT, показана по-долу.

INSERT INTO `table_name`(column_1,column_2,...) VALUES (стойност_1,стойност_2,...);

  • INSERT INTO `име_на_таблица`е командата, която казва на MySQL сървъра да добави нов ред в таблица с име `table_name`.
  • (колона_1,колона_2,...)указва колоните, които да бъдат актуализирани в новия ред
  • СТОЙНОСТИ (стойност_1,стойност_2,...)указва стойностите, които да се добавят в новия ред

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

  • Низови типове данни- всички стойности на низа трябва да бъдат затворени в единични кавички.
  • Числови типове данни- всички числови стойности трябва да се предоставят директно, без да се затварят в единични или двойни кавички.
  • Типове данни за дата- поставете стойностите на датата в единични кавички във формат "ГГГГ-ММ-ДД".

Пример:

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

Пълни имена Дата на раждане пол Физически адрес пощенски адрес Телефон за връзка Имейл адрес
Леонард Хофстадтер Мъжки Уудкрест 0845738767
Шелдън Купър Мъжки Уудкрест 0976736763
Раджеш Кутрапали Мъжки Феървю 0938867763
Лесли Уинкъл 14/02/1984 Мъжки 0987636553
Хауърд Воловиц 24/08/1981 Мъжки Южен парк П.О. Кутия 4563 0987786553

Lets" INSERT данни един по един. Ще започнем с Леонард Хофстадтер. Ще третираме номера за контакт като числов тип данни и няма да ограждаме номера в единични кавички.

INSERT INTO `members` (`full_names`,`gender`,`physical_address`,`contact_number`) VALUES ("Leonard Hofstadter","Male","Woodcrest",0845738767);

Изпълнението на горния скрипт премахва 0 от номера за контакт на Леонард. Това е така, защото стойността ще се третира като числова стойност и нулата (0) в началото се изпуска, тъй като не е значима.

За да се избегнат подобни проблеми, стойността трябва да бъде оградена в единични кавички, както е показано по-долу -

INSERT INTO `members` (`full_names`,`gender`,`physical_address`,`contact_number`) VALUES ("Sheldon Cooper","Male","Woodcrest", "0976736763");

В горния случай zero(0) няма да бъде премахната

Промяната на реда на колоните няма ефект върху заявката INSERT, стига правилните стойности да са картографирани към правилните колони.

Заявката, показана по-долу, демонстрира горната точка.

INSERT INTO `members` (`contact_number`,`gender`,`full_names`,`physical_address`)VALUES ("0938867763","Мъж","Rajesh Koothrappali","Woodcrest");

Горните заявки пропуснаха колоната за дата на раждане, по подразбиране MySQL ще вмъкне NULL стойности в колони, които са пропуснати в заявката INSERT.

Нека сега вмъкнем записа за Лесли, който има предоставената дата на раждане. Стойността на датата трябва да бъде оградена в единични кавички във формата "ГГГГ-ММ-ДД".

INSERT INTO `members` (`full_names`,`date_of_birth`,`gender`,`physical_address`,`contact_number`) СТОЙНОСТИ ("Leslie Winkle","1984-02-14","Male","Woodcrest"," 0987636553");

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

INSERT INTO `members` VALUES (9,"Howard Wolowitz","Male","1981-08-24","SouthPark","P.O. Box 4563", "0987786553", "lwolowitzemail.me");

Нека сега използваме израза SELECT, за да видим всички редове в таблицата с членове. SELECT * FROM `members`;

членски_номерпълни_именаполдата на ражданефизически адреспощенски адресконтактен_номерелектронна поща
1 Джанет ДжоунсЖенски пол21-07-1980 Първа улица Парцел №4Лична чанта0759 253 542 Този имейл адрес е защитен от спам ботове. Трябва да имате активиран JavaScript, за да го видите.
2 Джанет Смит ДжоунсЖенски пол23-06-1980 Мелроуз 123НУЛАНУЛАТози имейл адрес е защитен от спам ботове. Трябва да имате активиран JavaScript, за да го видите.
3 Робърт ФилМъжки12-07-1989 3-та улица 34НУЛА12345 Този имейл адрес е защитен от спам ботове. Трябва да имате активиран JavaScript, за да го видите.
4 Глория УилямсЖенски пол14-02-1984 2-ра улица 23НУЛАНУЛАНУЛА
5 Леонард ХофстадтерМъжкиНУЛАУудкрестНУЛА845738767 НУЛА
6 Шелдън КупърМъжкиНУЛАУудкрестНУЛА976736763 НУЛА
7 Раджеш КутрапалиМъжкиНУЛАУудкрестНУЛА938867763 НУЛА
8 Лесли УинкълМъжки14-02-1984 УудкрестНУЛА987636553 НУЛА
9 Хауърд ВоловицМъжки24-08-1981 Южен паркП.О. Кутия 4563987786553 Този имейл адрес е защитен от спам ботове. Трябва да имате активиран JavaScript, за да го видите.

Забележете, че номерът за контакт на Леонард Хофстадтер е изпуснал нулата (0) от номера за контакт. Другите номера за връзка не са изпуснали нулата (0) в началото.

Вмъкване в таблица от друга таблица

Командата INSERT може да се използва и за вмъкване на данни в таблица от друга таблица. Основният синтаксис е както е показано по-долу.

INSERT INTO table_1 SELECT * FROM table_2;

Нека сега да разгледаме практически пример, ще създадем фиктивна таблица за категории на филми за демонстрационни цели. Ще наречем новата таблица с категории категории_архив. Скриптът, показан по-долу, създава таблицата.

CREATE TABLE `categories_archive` (`category_id` int(11) AUTO_INCREMENT, `category_name` varchar(150) DEFAULT NULL, `remarks` varchar(500) DEFAULT NULL, PRIMARY KEY (`category_id`))

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

Нека сега вмъкнем всички редове от таблицата с категории в таблицата с архив на категориите. Скриптът, показан по-долу, ни помага да постигнем това.

INSERT INTO `categories_archive` SELECT * FROM `categories`;

Изпълнението на горния скрипт вмъква всички редове от таблицата с категории в таблицата с архив на категориите. Обърнете внимание, че структурите на таблиците ще трябва да бъдат еднакви, за да работи скриптът. По-стабилен скрипт е този, който картографира имената на колоните във вмъкнатата таблица с тези в таблицата, съдържаща данните.

Показаната по-долу заявка демонстрира използването му.

INSERT INTO `categories_archive`(category_id,category_name,remarks) SELECT category_id,category_name,remarks FROM `categories`;

Изпълнение на заявката SELECT

ИЗБЕРЕТЕ * ОТ `categories_archive`

дава следните резултати, показани по-долу.

идентификатор_на_категорияИме на категориязабележки
1 КомедияФилми с хумор
2 РомантиченЛюбовни истории
3 ЕпосИстория на древни филми
4 УжасНУЛА
5 Научна фантастикаНУЛА
6 ТрилърНУЛА
7 ДействиеНУЛА
8 Романтична комедияНУЛА
9 Анимационни филмиНУЛА
10 Анимационни филмиНУЛА

Резюме

  • Командата INSERT се използва за добавяне на нови данни в таблица
  • Стойностите на датата и низа трябва да бъдат оградени в единични кавички.
  • Числовите стойности не е необходимо да бъдат оградени в кавички.
  • Командата INSERT може да се използва и за вмъкване на данни от една таблица в друга.

В допълнение към оператора 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, "Алексей", "Васин", "d3");

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

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

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

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

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

Ред на стойностите в оферта VALUESОператорите 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 (в примерите по-горе) бяха празни. Ако таблицата вече съществува и съдържа редове с данни, тогава към нея ще бъдат добавени нови редове.


Връх