SQL INSERT INTO SELECT-sats. SQL INSERT INTO SELECT-sats Lägger till hela rader

Förutom SELECT-satsen som diskuterats tidigare, innehåller Data Manipulation Language (DML) tre andra satser: INSERT, UPDATE och DELETE. Liksom SELECT-satsen fungerar dessa tre satser på antingen tabeller eller vyer. Den här artikeln täcker INSERT-satsen och de andra två satserna behandlas i nästa artikel.

INSERT-sats infogar rader (eller delar av rader) i en tabell. Det finns två olika former av denna instruktion:

INSERT tab_name [(col_list)] STANDARDVÄRDEN | VÄRDEN (( STANDARD | NULL | uttryck ) [ ,...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement | execute_statement) Syntaxkonventioner

Den första formen av instruktionen låter dig infoga en rad (eller en del av den) i tabellen. Och den andra formen av INSERT-satsen låter dig infoga resultatuppsättningen av en SELECT-sats eller en lagrad procedur som exekveras av en EXECUTE-sats i en tabell. Den lagrade proceduren måste returnera data som ska infogas i tabellen. När den används med en INSERT-sats kan en SELECT-sats välja värden från en annan eller samma tabell som data infogas i, så länge som datatyperna för motsvarande kolumner är kompatibla.

För båda formulären måste datatypen för varje infogat värde vara kompatibel med datatypen för motsvarande tabellkolumn. Alla strängar och temporära data måste omges av citattecken; Numeriska värden behöver inte stå inom citattecken.

Infoga en enda rad

För båda formerna av INSERT-satsen är det valfritt att uttryckligen ange kolumnlistan. Att inte lista kolumner är detsamma som att ange alla kolumner i tabellen.

DEFAULT VALUES parameter infogar standardvärden för alla kolumner. Kolumner med datatypen TIMESTAMP eller IDENTITY-egenskapen infogas som standard med värden som genereras automatiskt av systemet. För kolumner med andra datatyper infogas motsvarande icke-null-standardvärde om det är tillgängligt, eller NULL annars. Om en kolumn inte tillåter nollvärden och inte har ett standardvärde definierat, misslyckas INSERT-satsen och ett meddelande visas.

Exemplet nedan infogar rader i tabellen Employee i SampleDb-databasen, vilket visar användningen av en INSERT-sats för att infoga en liten mängd data i databasen:

ANVÄND SampleDb; INFOGA I Anställda VÄRDEN (34990, "Andrey", "Batonov", "d1"); INSERT INTO Employee VALUES (38640, "Alexey", "Vasin", "d3");

Det finns två olika sätt att infoga värden i en ny rad. INSERT-satsen i exemplet nedan använder uttryckligen nyckelordet NULL och infogar ett NULL-värde i motsvarande kolumn:

ANVÄND SampleDb; INFOGA I Anställda VÄRDEN (34991, "Andrey", "Batonov", NULL);

För att infoga värden i vissa (men inte alla) kolumner i en tabell behöver du vanligtvis explicit ange dessa kolumner. Ospecificerade kolumner måste antingen tillåta NULL-värden eller ha ett standardvärde definierat.

ANVÄND SampleDb; INSERT INTO Employee(Id, FirstName, LastName) VÄRDEN (34992, "Andrey", "Batonov");

De två föregående exemplen är likvärdiga. I tabellen Employee är den enda kolumnen som tillåter NULL-värden kolumnen DepartmentNumber, och alla andra kolumner inaktiverades av NOT NULL-satsen i CREATE TABLE-satsen.

Värdeordning i VALUES erbjudande INSERT-satser kan skilja sig från den ordning som anges i CREATE TABLE-satsen. I det här fallet måste deras ordning matcha den ordning som motsvarande kolumner är listade i kolumnlistan. Nedan är ett exempel på att infoga data i en annan ordning än originalet:

ANVÄND SampleDb; INSERT INTO Employee(Departament Number, AfterName, Id, FirstName) VÄRDEN ("d1", "Batonov", 34993, "Andrey");

Infogar flera rader

Den andra formen av INSERT-satsen infogar en eller flera rader valda av en underfråga i tabellen. Exemplet nedan visar hur man infogar rader i en tabell med den andra formen av INSERT-satsen. I det här fallet exekveras en fråga för att välja nummer och namn på avdelningar i Moskva, och den resulterande resultatuppsättningen laddas in i en ny tabell som skapats tidigare.

Den nya MoscowDepartment-tabellen som skapats i exemplet ovan har samma kolumner som den befintliga Department-tabellen, förutom den saknade platskolumnen. Underfrågan i INSERT-satsen väljer alla rader i avdelningstabellen för vilka kolumnvärdet Plats är "Moskva", som sedan infogas i den nya tabellen som skapas i början av frågan.

Exemplet nedan visar ett annat sätt att infoga rader i en tabell med den andra formen av INSERT-satsen. I det här fallet exekveras en förfrågan för att välja personalnummer, projektnummer och projektstartdatum för alla anställda med positionen "Manager" som arbetar med projekt p2 och sedan ladda den resulterande resultatuppsättningen i en ny tabell som skapas i början av frågan:

ANVÄND 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";

Innan du infogade rader med hjälp av INSERT-satsen var tabellerna MoscowDepartment och ManagerTeam (i exemplen ovan) tomma. Om tabellen redan fanns och innehöll rader med data, skulle nya rader läggas till i den.

I tidigare avsnitt har vi tittat på arbetet med att hämta data från förskapade tabeller. Nu är det dags att ta reda på hur vi kan skapa/ta bort tabeller, lägga till nya poster och ta bort gamla. För dessa ändamål i SQL Det finns operatörer som: SKAPA- skapar en tabell, ÄNDRA- ändrar tabellstrukturen, SLÄPPA- tar bort en tabell eller ett fält, FÖRA IN- lägger till data i tabellen. Låt oss börja bekanta oss med denna grupp av operatörer från operatören FÖRA IN.

1. Lägga till hela rader

Som namnet antyder, operatören FÖRA IN används för att infoga (lägga till) rader i en databastabell. Du kan lägga till på flera sätt:

  • - lägg till en hel rad
  • - lägg till en del av en rad
  • - lägg till frågeresultat.

Så för att lägga till en ny rad i en tabell måste vi ange tabellnamnet, lista kolumnnamnen och ange värdet för varje kolumn med hjälp av konstruktionen SÄTT IN I tabellnamn (fält1, fält2 ...) VÄRDEN (värde1, värde2...). Låt oss titta på ett exempel.

INFOGA I säljare (ID, adress, stad, säljarens namn, land) VÄRDEN("6", "1st Street", "Los Angeles", "Harry Monroe", "USA")

Du kan också ändra ordningen på kolumnnamnen, men samtidigt måste du ändra ordningen på värdena i parametern VÄRDEN.

2. Lägga till en del av raderna

I föregående exempel, när du använder operatorn FÖRA IN vi har uttryckligen markerat tabellkolumnnamnen. Med denna syntax kan vi hoppa över några kolumner. Det betyder att du anger värden för vissa kolumner men inte anger dem för andra. Till exempel:

INFOGA I Säljarens (ID, Ort, Säljarnamn) VÄRDEN("6", "Los Angeles", "Harry Monroe")

I det här exemplet har vi inte angett ett värde för två kolumner Adress Och Land. Du kan utesluta vissa kolumner från uttalandet SÄTT IN I, om detta tillåter tabelldefinitionen. I detta fall måste ett av villkoren vara uppfyllt: denna kolumn definieras som giltig NULL(avsaknad av något värde) eller det angivna standardvärdet i tabelldefinitionen. Det betyder att om inget värde anges kommer standardvärdet att användas. Om du saknar en kolumn i en tabell som inte tillåter att värden visas i dess rader NULL och inte har ett standardvärde definierat, kommer DBMS att generera ett felmeddelande och raden kommer inte att läggas till.

3. Lägga till valda data

I föregående exempel infogade vi data i tabeller genom att ange dem manuellt i frågan. Dock operatören SÄTT IN I tillåter oss att automatisera denna process om vi vill infoga data från en annan tabell. För detta ändamål i SQL finns en sådan konstruktion som INFOGA I ... VÄLJ .... Denna design låter dig samtidigt välja data från en tabell och infoga den i en annan. Låt oss anta att vi har ett annat bord Säljare_EU med en lista över säljare av våra varor i Europa och vi måste lägga till dem i den allmänna tabellen Säljare. Strukturen för dessa tabeller är densamma (samma antal kolumner och samma namn), men data är olika. För att göra detta kan vi skriva följande fråga:

INFOGA I Säljare (ID, Adress, Stad, Säljarnamn, Land) VÄLJID, adress, stad, säljarens namn, land FRÅN Säljare_EU

Du måste vara uppmärksam så att värdena för interna nycklar inte upprepas (fält ID), annars uppstår ett fel. Operatör VÄLJ kan också innehålla förslag VAR för att filtrera data. Det bör också noteras att DBMS inte uppmärksammar namnen på kolumnerna i uttalandet VÄLJ, bara i vilken ordning de är ordnade är viktig för henne. Därför data i den första angivna kolumnen som valdes pga VÄLJ, kommer att fyllas i den första kolumnen i tabellen i alla fall Säljare, specificerad efter operatören SÄTT IN I, oavsett fältnamn.

4. Kopiera data från en tabell till en annan

När man arbetar med databaser finns det ofta ett behov av att skapa kopior av alla tabeller för säkerhetskopiering eller modifiering. För att göra en fullständig kopia av en tabell tillhandahåller SQL en separat sats VÄLJ IN. Vi behöver till exempel skapa en kopia av tabellen Säljare, måste du skriva begäran enligt följande:

VÄLJ * INTO Sellers_new FROM Sellers

Till skillnad från den tidigare designen INFOGA I ... VÄLJ ... När data läggs till i en befintlig tabell, kopierar designen data till den nya tabellen. Du kan också säga att den första konstruktionen importerar data och den andra exporterar. När du använder designen VÄLJ ... TILL ... FRÅN ... Följande bör övervägas:

  • - du kan använda vilka meningar som helst i operatorn VÄLJ, Till exempel GRUPP AV Och HAR
  • - du kan använda en join för att lägga till data från flera tabeller
  • - data kan bara läggas till i en tabell, oavsett hur många tabeller den togs från.

Denna sats lägger till en eller flera poster i en tabell (utför en tilläggsfråga).

Syntax

Begäran om att lägga till flera poster:

SÄTT IN I final_object [(fält1[, fält2[, ...]])]
VÄLJ [ källa.]fält1[, fält2[, ...]
FRÅN tabelluttryck

Begäran om att lägga till en post:

SÄTT IN I final_object [(fält1[, fält2[, ...]])]
VÄRDEN ( fält1[, fält2[, ...])

INSERT INTO-satsen består av följande element:

Del

Beskrivning

final_object

Namnet på tabellen eller frågan där poster läggs till.

fält1, fält2

Efter argumentet final_object- namn på fält som data läggs till; efter argumentet källa- Namnen på de fält från vilka data extraheras.

extern_databas

Sökväg till extern databas. För en beskrivning av sökvägen, se artikeln om IN-satsen.

källa

Namnet på tabellen eller frågan från vilken poster kopieras.

tabelluttryck

Ett eller flera tabellnamn som du vill hämta poster från. Detta argument kan vara namnet på en enskild tabell, ett resultatuttryck konstruerat med en INNER JOIN, LEFT JOIN eller RIGHT JOIN, eller en lagrad fråga.

värde1, värde2

Värden som kommer att läggas till specifika fält i den nya posten. Varje värde infogas i fältet som motsvarar dess position i listan: värde1 lagt till fält1 ny ingång, värde2- V fält2 etc. Du måste separera värden med ett kommatecken och omge textfält inom citattecken (" ").

Anteckningar

INSERT INTO-satsen kan lägga till en enskild post i en tabell med syntaxen ovan. I det här fallet anger du namn och värden för varje fält i posten. Du måste ange alla fält i posten som värden är tilldelade och motsvarande värden. Om du inte anger ett fältvärde kommer det att tilldelas standardvärdet eller NULL. Poster läggs till i slutet av tabellen.

INSERT INTO-satsen kan också användas för att lägga till en uppsättning poster från en annan tabell eller fråga med hjälp av SELECT... FROM-satsen som visas ovan (se Frågesyntax för att lägga till flera poster). I det här fallet anger SELECT-satsen de fält som ska läggas till i det angivna final_object.

Källa eller final_object kan vara en tabell eller en fråga. När en fråga ges lägger Microsoft Access-databasmotorn till poster i alla tabeller som den returnerar.

Att använda INSERT INTO-satsen är valfritt. Om det anges måste det föregå SELECT-satsen.

Om måltabellen innehåller en primärnyckel, se till att värdena du lägger till i ett eller flera av primärnyckelfälten är unika och skiljer sig från NULL; annars läggs inte posterna till.

Om poster läggs till i en tabell med ett Räknarfält och du vill numrera om dem, inkludera inte Räknarfältet i frågan. Inkludera Counter-fältet i frågan om du vill bevara de ursprungliga värdena från fältet.

Du kan lägga till poster i en tabell i en annan databas med hjälp av IN-satsen.

För att skapa en tabell, använd SELECT... INTO-satsen för att fråga efter att skapa tabellen.

Innan du kör en tilläggsfråga, använd en urvalsfråga med samma urvalskriterier för att använda resultaten för att avgöra vilka poster som kommer att läggas till.

En tilläggsfråga kopierar poster från en eller flera tabeller till en annan tabell. I det här fallet förblir tabellerna som innehåller de tillagda posterna oförändrade.

Istället för att lägga till poster från en annan tabell kan du ställa in värdet för varje fält i en separat ny post med hjälp av VALUES-satsen. Om en fältlista utelämnas måste VALUES-satsen inkludera motsvarande värden för varje tabellfält; annars misslyckas INSERT-operationen. Använd INSERT INTO-satsen tillsammans med VALUES-satsen för varje ytterligare post som du vill skapa.

Med SQL kan du kopiera information från en tabell till en annan.

INSERT INTO SELECT-satsen kopierar data från en tabell och infogar den i en befintlig tabell.

SQL INSERT INTO SELECT-sats,

INSERT INTO SELECT-satsen väljer data från en tabell och infogar den i en befintlig tabell. Eventuella befintliga rader i måltabellen ändras inte.

SQL INSERT INTO SELECT, Syntax

Vi kan kopiera alla kolumner från en tabell till en annan, befintlig tabell:

SÄTT IN I Tabell 2
VÄLJ FRÅN bord 1;

Eller så kan vi bara kopiera de kolumner vi vill ha till en annan befintlig tabell:

SÄTT IN I Tabell 2
(kolumnnamn(n))
VÄLJ kolumnnamn
FRÅN bord 1;

Demoversion av databasen

I den här handledningen kommer vi att använda den välkända databasen Northwind.

Nedan är ett urval från tabellen "Kunder":

användar IDKundens namnKontaktpersonenAdressstadPostnummerEtt land
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Tyskland
2 Ana Trujillo Emparedados och helados Ana Trujillo Avda. de la Constitucion 2222 Mexiko D.F. 05021 Mexiko
3 Antonio Moreno Taqueria Antonio Moreno Mataderos 2312 Mexiko D.F. 05023 Mexiko

Och urvalet från tabellen "Leverantörer":

SQL INSERT INTO SELECT, exempel

Kopierar bara några få kolumner från "Leverantörer" till "Kunder":

Kopierar endast tyska leverantörer till "Kunder".

Hej alla! Den här artikeln kommer att diskutera hur du kan lägga till data i tabellen i Microsoft SQL Server, om du redan är åtminstone lite bekant med T-SQL-språket, så insåg du förmodligen att nu kommer vi att prata om INSERT-satsen, samt hur den kan användas för att lägga till data i en tabell.

Låt oss börja, som vanligt, med lite teori.

INSERT-sats i T-SQL

FÖRA INär en T-SQL-instruktion som är designad för att lägga till data till en tabell, dvs. skapa nya rekord. Denna instruktion kan användas både för att lägga till en enstaka rad i en tabell och för att infoga data i bulk. INSERT-satsen kräver tillstånd för att infoga data ( FÖRA IN) till måltabellen.

Det finns flera sätt att använda INSERT-satsen på den del av data som behöver infogas:

  • Lista specifika värden att infoga;
  • Ange en datamängd som en SELECT-fråga;
  • Specificering av en datamängd i form av ett proceduranrop som returnerar tabelldata.

Förenklad syntax

INFOGA [tabell] ( lista över kolumner...) VÄRDEN ( värdelista...) Eller VÄLJ provbegäran Eller UTFÖR procedur

  • INSERT INTO är ett kommando för att lägga till data till en tabell;
  • Tabell är namnet på måltabellen som du vill infoga nya poster i;
  • Kolumnlistan är en lista med kolumnnamn för tabellen som data kommer att infogas i, separerade med kommatecken;
  • VALUES är en tabellvärdekonstruktor med vilken vi anger de värden som vi kommer att infoga i tabellen;
  • Listan med värden är de värden som kommer att infogas, separerade med kommatecken. De är listade i den ordning som kolumnerna visas i kolumnlistan;
  • SELECT är en fråga för att välja data som ska infogas i en tabell. Resultatuppsättningen som frågan returnerar måste matcha listan med kolumner;
  • EXECUTE är ett proceduranrop för att erhålla data för infogning i en tabell. Resultatuppsättningen som den lagrade proceduren returnerar måste matcha listan med kolumner.

Ungefär så ser den förenklade syntaxen för INSERT INTO-satsen ut, i de flesta fall är det så här du lägger till nya poster i tabeller.

Listan över kolumner som du ska infoga data i behöver inte skrivas, i så fall kommer deras ordning att bestämmas baserat på den faktiska ordningen för kolumnerna i tabellen. Du måste komma ihåg denna ordning när du anger värden att infoga eller skriver en fråga att välja. Personligen rekommenderar jag att du fortfarande anger en lista med kolumner där du planerar att lägga till data.

Du bör också komma ihåg att kolumnlistan respektive värdelistan måste innehålla så kallade obligatoriska kolumner, det är de som inte kan innehålla NULL-värdet. Om du inte anger dem, och kolumnen inte har ett standardvärde, kommer ett fel att uppstå.

Jag skulle också vilja notera att datatypen för värdena som du kommer att infoga måste matcha datatypen för kolumnen som detta värde kommer att infogas i, eller åtminstone stödja implicit konvertering. Men jag råder dig att kontrollera datatypen ( formatera) värden, både i värdelistan och i SELECT-frågan.

Nog med teori, låt oss gå vidare till praktiken.

Inledande data

För att lägga till data i tabellen behöver vi själva tabellen, så låt oss skapa den och försöka lägga till poster till den.

Notera! Alla exempel kommer att köras i Microsoft SQL Server 2016 Express.

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

Vår testtabell kommer att innehålla en lista över produkter med priser.

Även i exemplen kommer vi att använda en procedur som returnerar ett tabellvärde för att lägga till data till tabellen, så låt oss skapa det också.

SKAPA PROCEDUR Testprocedur SOM BÖRJA VÄLJ Produktnamn, Pris FRÅN Testtabell SLUT

Till exempel kommer den att returnera data från den nyskapade TestTable-tabellen.

Notera!

Som du förstår innebär läsning av detta material att du har viss kunskap om T-SQL-språket, så om något inte är klart för dig rekommenderar jag att du bekantar dig med följande material:

Exempel 1 – Lägga till en ny post i en tabell med hjälp av tabellvärdekonstruktorn

Låt oss först försöka lägga till en post och omedelbart titta på resultatet, d.v.s. Låt oss skriva en begäran om ett prov.

INSERT I TestTable(Produktnamn, Pris) VÄRDEN ("Dator", 100) GÅ VÄLJ * FRÅN Testtabell

Du ser att efter tabellnamnet listade vi namnen på kolumnerna som vi kommer att lägga till data till, separerade med kommatecken, sedan angav vi nyckelordet VÄRDEN och inom parentes också, i samma ordning, separerade med kommatecken, skrev vi värdena som vi vill infoga.

Efter INSERT-satsen skrev jag en SELECT-sats och separerade dem med en GO-sats.

Låt oss nu föreställa oss att vi måste lägga till några rader. Vi kommer att skriva följande begäran för detta.

INSERT I TestTable(Produktnamn, Pris) VÄRDEN ("Dator", 100), ("Tangentbord", 20), ("Monitor", 50) GÅ VÄLJ * FRÅN Testtabell


Exempel 2 - Lägga till nya rader i en tabell med hjälp av en SELECT-fråga

Mycket ofta finns det behov av att lägga till mycket data i en tabell, till exempel baserat på en urvalsfråga, d.v.s. VÄLJ. För att göra detta, istället för VÄRDEN, behöver vi bara specificera begäran.

INSERT I TestTable(Produktnamn, Pris) VÄLJ Produktnamn, Pris FRÅN TestTable WHERE Id >


I det här exemplet skrev vi en SELECT-fråga som returnerar data från TestTable-tabellen, men inte allt, utan bara de med ett ID större än 2. Och resultatet infogades i samma TestTable-tabell.

Som ett exempel på hur du kan lägga till poster i en tabell utan att ange en lista med kolumner, låt oss skriva en annan datainfogningsfråga som kommer att göra exakt samma sak som frågan ovan, bara den kommer inte att lista kolumnerna som ska infogas.

INSERT I TestTable VÄLJ Produktnamn, Pris FRÅN TestTable WHERE Id > 2 GÅ VÄLJ * FRÅN TestTable


I det här fallet är vi säkra på att i TestTable-tabellen är den första kolumnen Produktnamn och den andra är Pris, så vi har råd att skriva det så. Men återigen, i praktiken är det bättre att ange en lista med kolumner.

Om du märkte, i alla exempel angav jag inte Id-kolumnen, men vi har det, inga fel inträffade, eftersom den här kolumnen har IDENTITY-egenskapen, genererar den automatiskt identifierare, så att infoga data i en sådan kolumn kan helt enkelt inte göras.

Exempel 3 - Lägga till nya poster i en tabell med hjälp av en lagrad procedur

Låt oss nu infoga data i tabellen som den lagrade proceduren kommer att returnera till oss. Innebörden här är densamma, istället för VÄRDEN och istället för en begäran indikerar vi ett proceduranrop. Men som du förstår måste ordningen och antalet kolumner som returneras av proceduren strikt matcha listan över kolumner som ska infogas ( även om kolumnlistan inte är specificerad).

INSERT I TestTable(Produktnamn, Pris) EXEC Testprocedur GO SELECT * FRÅN TestTable


Jag hoppas att det här materialet hjälpte dig att förstå instruktionerna. SÄTT IN I, och det är allt jag har för tillfället!