SQL INSERT INTO SELECT-sats. Transact-SQL - datainsättning Lägger till del av rader

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".

Senaste uppdatering: 2017-07-13

För att lägga till data, använd kommandot INSERT, som har följande formella syntax:

INFOGA tabellnamn [(kolumnlista)] VÄRDEN (värde1, värde2, ... värdeN)

Först kommer uttrycket INSERT INTO, sedan inom parentes kan du ange en kommaseparerad lista med kolumner som data ska läggas till, och i slutet, efter ordet VALUES, listas värdena som ska läggas till för kolumnerna i parentes.

Anta till exempel att följande databas har skapats tidigare:

SKAPA DATABAS productsdb; GÅ ANVÄND productsdb; SKAPA TABELL Produkter (Id INT IDENTITET PRIMÄRNYCKEL, Produktnamn NVARCHAR(30) NOT NULL, Tillverkare NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Pris PENGAR INTE NULL)

Låt oss lägga till en rad med kommandot INSERT:

INFOGA produkter VÄRDEN ("iPhone 7", "Apple", 5, 52000)

Efter framgångsrik körning i SQL Server Management Studio bör meddelandet "1 rad(er) påverkas" visas i meddelandefältet:

Det är värt att tänka på att värdena för kolumnerna inom parentes efter nyckelordet VALUES skickas i den ordning som de deklareras. Till exempel, i CREATE TABLE-satsen ovan kan du se att den första kolumnen är Id. Men eftersom IDENTITY-attributet är specificerat för det, genereras värdet för denna kolumn automatiskt och kan utelämnas. Den andra kolumnen representerar ProductName, så det första värdet, strängen "iPhone 7", kommer att skickas till den kolumnen. Det andra värdet - strängen "Apple" kommer att skickas till den tredje kolumnen Tillverkare och så vidare. Det vill säga värdena skickas till kolumnerna enligt följande:

    Produktnamn: "iPhone 7"

    Tillverkare: "Apple"

När du anger värden kan du också ange de omedelbara kolumner som värdena kommer att läggas till:

INSERT INTO Products (produktnamn, pris, tillverkare) VÄRDEN ("iPhone 6S", 41000, "Apple")

Här anges värdet endast för tre kolumner. Dessutom överförs nu värdena i kolumnernas ordning:

    Produktnamn: "iPhone 6S"

    Tillverkare: "Apple"

För ospecificerade kolumner (i det här fallet ProductCount) kommer ett standardvärde att läggas till om DEFAULT-attributet anges, eller ett NULL-värde. Ospecificerade kolumner måste dock vara nullbara eller ha ett DEFAULT-attribut.

Vi kan också lägga till flera rader samtidigt:

INFOGA I PRODUKTS VÄRDEN ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)

I det här fallet kommer tre rader att läggas till i tabellen.

När vi lägger till kan vi också ange att kolumnen ska ha ett standardvärde med nyckelordet DEFAULT eller ett NULL-värde:

INFOGA I produkter (produktnamn, tillverkare, produktantal, pris) VÄRDEN ("Mi6", "Xiaomi", DEFAULT, 28000)

I det här fallet kommer standardvärdet för kolumnen ProductCount att användas (om det är inställt, om det inte är det, då NULL).

Om alla kolumner har ett DEFAULT-attribut som anger ett standardvärde, eller är nullbara, kan du infoga standardvärden för alla kolumner:

INFOGA I produkter STANDARDVÄRDEN

Men om vi tar tabellen Products, kommer ett sådant kommando att misslyckas med ett fel, eftersom flera fält inte har DEFAULT-attributet och samtidigt inte tillåter NULL-värdet.

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 i en tabell resultatuppsättningen av en SELECT-sats eller en lagrad procedur som exekveras av en EXECUTE-sats. 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 skapad 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.