Основи на T-SQL. DML

Основи на T-SQL.  DML
Основи на T-SQL. DML

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

Синтаксисът на оператора е както следва:

    ВМЪКНЕТЕ В [ (,...) ]

    (СТОЙНОСТИ(,…))

  1. | (СТОЙНОСТИ ПО ПОДРАЗБИРАНЕ)

Както можете да видите от представения синтаксис, списъкът с колони не е задължителен (квадратните скоби в описанието на синтаксиса показват това). Ако липсва, списъкът с вмъкнати стойности трябва да е пълен, тоест да предостави стойности за всички колони на таблицата. В този случай редът на стойностите трябва да съответства на реда, определен от оператора CREATE TABLE за таблицата, в която се вмъкват редовете. Освен това тези стойности трябва да са от същия тип данни като колоните, в които са въведени. Като пример, помислете за вмъкване на ред в таблицата с продукти, създадена от следния оператор CREATE TABLE:

    CREATE TABLE продукт

    maker char (1) NOT NULL,

    модел varchar(4) NOT NULL,

    тип varchar(7) NOT NULL

Да предположим, че искате да добавите към тази таблица PC модел 1157 от производител B. Това може да стане със следния оператор:

    ВМЕСТЕ В ПРОДУКТА

    СТОЙНОСТИ ("B", 1157, "PC");

Ако зададете списък с колони, можете да промените техния „естествен“ ред:

    INSERT INTO Продукт (тип, модел, производител)

    СТОЙНОСТИ ("PC", 1157, "B");

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

    СЪЗДАВАНЕ НА ТАБЛИЦА product_D

    maker char (1) NULL,

    модел varchar(4) NULL,

    тип varchar (7 ) NOT NULL DEFAULT "PC"

Имайте предвид, че тук стойностите на всички колони имат стойности по подразбиране (първите две са NULL, а последната колона е тип - PC). Сега можем да напишем:

    INSERT INTO Product_D (модел, производител)

    VALUES(1157, "B");

В този случай липсващата стойност при вмъкване на ред ще бъде заменена със стойността по подразбиране - PC. Обърнете внимание, че ако на дадена колона не е дадена стойност по подразбиране в оператор CREATE TABLE и е посочено ограничение NOT NULL, за да се забрани използването на NULL в тази колона на таблицата, тогава се приема стойността по подразбиране NULL.

Възниква въпросът: възможно ли е да не посочите списък с колони и въпреки това да използвате стойностите по подразбиране? Отговорът е да. За да направите това, вместо изрично да посочите стойността, използвайте запазената дума DEFAULT:

    INSERT INTO Product_D

    СТОЙНОСТИ ("B", 1158, ПО ПОДРАЗБИРАНЕ);

Тъй като всички колони имат стойности по подразбиране, за да вмъкнете ред със стойности по подразбиране, можете да напишете:

    INSERT INTO Product_D

    СТОЙНОСТИ (ПО ПОДРАЗБИРАНЕ, ПО ПОДРАЗБИРАНЕ, ПО ПОДРАЗБИРАНЕ);

За този случай обаче има специална конструкция DEFAULT VALUES (вижте синтаксиса на оператора), с която горният оператор може да бъде пренаписан във формата

    INSERT INTO Product_D ПО ПОДРАЗБИРАНЕ СТОЙНОСТИ;

Имайте предвид, че когато вмъквате ред в таблицата, всички ограничения, наложени на тази маса. Възможно е да има ограничения първичен ключили уникален индекс, проверете ограничения като CHECK , ограничения референтна цялост. Ако някое ограничение е нарушено, вмъкването на ред ще бъде отхвърлено. Нека сега разгледаме случая на използване на подзаявка. Да предположим, че трябва да вмъкнем в таблицата Product_D всички редове от таблицата Product, свързани с модели персонални компютри(тип = 'PC'). Тъй като стойностите, от които се нуждаем, вече са в някаква таблица, ръчното генериране на вмъкнати редове е, първо, неефективно и, второ, може да позволи грешки при въвеждане. Използването на подзаявка решава тези проблеми:

Използването на символа „*“ в подзаявката е оправдано в този случай, тъй като редът на колоните е еднакъв и за двете таблици. Ако случаят не беше такъв, ще трябва да се приложи списък с колони в оператора INSERT, подзаявката или и двете, което ще съответства на реда на колоните:

Тук, както и преди, можете да посочите не всички колони, ако искате да използвате съществуващите стойности по подразбиране, например:

В този случай колоната тип на таблицата Product_D ще бъде заменена със стойността по подразбиране PC за всички вмъкнати редове.

Обърнете внимание, че когато използвате подзаявка, съдържаща предикат, ще бъдат вмъкнати само онези редове, за които стойността на предиката е TRUE (не UNKNOWN!). С други думи, ако колоната тип в таблицата Product беше NULLable и тази стойност присъстваше в определен брой редове, тогава тези редове нямаше да бъдат вмъкнати в таблицата Product_D.

Изкуствената техника на използване на подзаявка, която формира ред с клаузата UNION ALL, ви позволява да преодолеете ограничението за вмъкване на един ред в оператора INSERT, когато използвате конструктора на ред в клаузата VALUES. Така че, ако трябва да вмъкнем няколко реда с помощта на един оператор INSERT, можем да напишем:

    INSERT INTO Product_D

    SELECT "B" AS maker, 1158 AS модел, "PC" AS тип

    СЪЮЗ ВСИЧКИ

    ИЗБЕРЕТЕ "C", 2190, "Лаптоп"

    СЪЮЗ ВСИЧКИ

    ИЗБЕРЕТЕ "D", 3219, "Принтер";

Използването на UNION ALL е за предпочитане пред UNION, дори ако е гарантирано отсъствието на дублиращи се редове, тъй като в този случай няма да се извърши проверка за елиминиране на дубликатите.

Трябва да се отбележи, че вмъкването на множество кортежи с помощта на конструктора на редове вече е реализирано в Система за управление на релационни бази данни (DBMS), разработена от Microsoft Corporation.Structured Query Language) е универсален компютърен език, използван за създаване, модифициране и манипулиране на данни в релационни бази данни. SQL сървър 2008. Като се има предвид тази възможност, последната заявка може да бъде пренаписана като:

    INSERT INTO Product_D VALUES

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

    ("C", 2190, "Лаптоп"),

Здравейте всички! Тази статия ще обсъди как можете добавете данни към таблицатав Microsoft SQL сървърАко вече сте поне малко запознати с езика T-SQL, вероятно сте разбрали, че сега ще говорим за оператора INSERT, както и как може да се използва за добавяне на данни към таблица.

Нека започнем, както обикновено, с малко теория.

Оператор INSERT в T-SQL

ВМЪКНЕТЕе T-SQL инструкция, която е предназначена да добавя данни към таблица, т.е. създаване на нови записи. Тази инструкцияможе да се използва както за добавяне на един ред към таблица, така и за групово вмъкване на данни. Операторът INSERT изисква разрешение за вмъкване на данни ( ВМЪКНЕТЕ) към целевата таблица.

Има няколко начина да използвате израза INSERT върху частта от данни, която трябва да бъде вмъкната:

  • Изброяване на конкретни стойности за вмъкване;
  • Задаване на набор от данни като SELECT заявка;
  • Задаване на набор от данни под формата на извикване на процедура, която връща таблични данни.

Опростен синтаксис

INSERT [таблица] ( списък с колони...) СТОЙНОСТИ ( списък със стойности, … ) Или ИЗБЕРЕТЕ примерна заявкаИли ИЗПЪЛНИТЕ процедура

  • 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 ("Computer", 100) GO SELECT * FROM TestTable

Виждате, че след името на таблицата изредихме имената на колоните, към които ще добавим данни, разделени със запетаи, след което посочихме ключова дума СТОЙНОСТИи в скоби също, в същия ред, разделени със запетаи, написахме стойностите, които искаме да вмъкнем.

След оператора INSERT написах оператор SELECT и ги разделих с оператор GO.

Сега нека си представим, че трябва да добавим няколко реда. Ще напишем следното искане за това.

INSERT INTO TestTable(ProductName, Price) VALUES ("Компютър", 100), ("Клавиатура", 20), ("Монитор", 50) ИЗБЕРЕТЕ * ОТ TestTable


Пример 2 - Добавяне на нови редове към таблица с помощта на SELECT заявка

Много често има нужда да добавите много данни към таблица, например въз основа на заявка за избор, т.е. ИЗБЕРЕТЕ. За да направим това, вместо VALUES, просто трябва да посочим заявката.

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


В този пример написахме заявка SELECT, която връща данни от таблицата TestTable, но не всички, а само тези с ID по-голям от 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, и това е всичко, което имам за сега!

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

Синтаксис

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

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 за всеки допълнителен запис, който искате да създадете.

СЪС използвайки 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“, ще ни помогне с това. Да започваме:

ВМЪКНЕТЕ- SQL оператор, който ви позволява да добавяте редове към таблица, като ги попълвате със стойности. Стойностите могат да бъдат вмъкнати чрез изброяване с помощта на думата стойности и изброяването им скобиразделени със запетаи.

Изявлението SQL INSERT, указващо колони, има следния синтаксис:

INSERT INTO ([, ... ]) стойности (,...);

Също така стойностите могат да бъдат записани без посочване на колони:

INSERT INTO стойности (,...);

Стойностите също могат да бъдат записани с помощта на оператора SQL SELECT (ще проучим оператора SELECT малко по-късно):

INSERT INTO SELECT Име на колона,... FROM име на таблица

Използване на оператора SQL SELECTМожете да вмъкнете повече от един запис. В случай, че няма зададени стойности за нито едно поле на таблица, те ще бъдат заменени със стойността по подразбиране null.

Пример за работа на оператора

Има таблица „Планети“. Използвайки оператора SQL INSERT, трябва да добавите запис, като присвоите следните стойности на полетата на таблицата - ID: 4; Име на планетата: Венера; Радиус: 6051; Слънчев сезон: 243; Година на откриване: 1610; HavingRings: Не; Отварачка: Галилео Галилей;

INSERT INTO Planets (ID, PlanetName, Radius, SunSeason, OpeningYear, HavingRings, Opener) СТОЙНОСТИ (4, "Венера", 6051, 243, 160, "Не", "Галилео Галилей");

След изпълнение на командата таблицата Планети ще изглежда така (както виждате, нова линияи е много просто):



Вероятно сте забелязали това този примерПоказах въз основа на първия синтаксис. Където трябва да напишете името на всяка колона, но същият пример може да бъде написан по различен начин:

ВМЪКНЕТЕ В СТОЙНОСТИ НА ПЛАНЕТИ (4, "Венера", 6051, 243, 160, "Не", "Галилео Галилей");

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

Ето моят малък урок за оператора INSERT в SQL. Надявам се всичко да ви е ясно, ако имате въпроси, пишете и аз определено ще отговоря.