SQL INSERT INTO SELECT-sats. SQL-fråga INSERT INTO - fyll databasen med information Sql-kommandosyntax för att infoga en rad

24.03.2023

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;

Demodatabas

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 IDKundnamnKontaktpersonenAdressstadPostnummerEtt land
1 Alfred 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 ett urval från tabellen "Leverantörer":

SQL INSERT INTO SELECT, exempel

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

Kopiera endast tyska leverantörer i "Kunder" .

Senaste uppdatering: 2017-07-13

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

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

I början finns en INSERT INTO-sats, sedan inom parentes kan du ange en lista med kolumner, separerade med kommatecken, i vilka data ska läggas till, och i slutet, efter ordet VALUES, inom parentes, värdena som ska läggas till för kolumnerna är listade.

Låt oss till exempel säga att följande databas skapades 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 meddelanderutan:

Observera 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 inställt för det, genereras värdet för denna kolumn automatiskt och det 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 kolumnerna där värden 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. Och nu skickas 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 är inställt, eller NULL. 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 standardvärdet används för kolumnen med nyckelordet DEFAULT eller NULL:

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

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

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

INFOGA I produkter STANDARDVÄRDEN

Men om du tar tabellen Produkter, kommer ett sådant kommando att misslyckas, eftersom flera fält inte har ett DEFAULT-attribut och samtidigt inte tillåter null-värden.

I de föregående avsnitten övervägde vi 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 tabellens struktur, SLÄPPA- tar bort en tabell eller ett fält, FÖRA IN- lägger till data i tabellen. Låt oss börja vår bekantskap 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 tabellen 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 markerade uttryckligen tabellkolumnnamnen. Med denna syntax kan vi hoppa över några kolumner. Det betyder att du anger ett värde för vissa kolumner men inte anger värden 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 det tillåter definitionen av tabellen. I det här fallet måste ett av följande villkor vara uppfyllt: denna kolumn är definierad som att tillåta värdet NULL(avsaknaden av något värde) eller i tabelldefinitionen det angivna standardvärdet. Det betyder att om inget värde anges kommer standardvärdet att användas. Om du hoppar över en kolumn i en tabell som inte tillåter värden i dess rader NULL och inte har ett standardvärde definierat, kommer DBMS att utfärda ett felmeddelande och denna rad kommer inte att läggas till.

3. Lägga till valda data

I de tidigare exemplen infogade vi data i tabeller genom att skriva 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 att göra detta har SQL en struktur så här: INFOGA I ... VÄLJ .... Denna design låter dig samtidigt välja data från en tabell och infoga dem i en annan. 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 olika data. 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 på att värdet på de interna nycklarna 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 ordningen på deras arrangemang ä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 ändå Säljare anges 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 blir det ofta nödvändigt att skapa kopior av alla tabeller för säkerhetskopiering eller modifiering. För att göra en fullständig kopia av en tabell i SQL, tillhandahålls 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 konstruktionen data till den nya tabellen. Man kan också säga att den första konstruktionen importerar data, medan den andra konstruktionen exporterar. När du använder strukturen VÄLJ ... TILL ... FRÅN ... följande bör beaktas:

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

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

Syntax

Fråga för att lägga till flera poster:

SÄTT IN I målobjekt [(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 målobjekt [(fält1[, fält2[, ...]])]
VÄRDEN ( fält1[, fält2[, ...])

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

Del

Beskrivning

målobjekt

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

fält1, fält2

Efter argumentet målobjekt- Namnen på de fält som uppgifterna läggs till; efter argumentet källa- namnen på de fält från vilka uppgifterna hämtas.

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 varifrån posterna kopieras.

tabelluttryck

Ett eller flera tabellnamn för att hämta poster från. Detta argument kan vara ett enda tabellnamn, resultatet av ett INNER JOIN-, LEFT JOIN- eller RIGHT JOIN-uttryck eller en sparad fråga.

värde1, värde2

Värden som ska läggas till i 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 nytt rekord, värde2- V fält2 etc. Du måste separera värdena med ett kommatecken och omge textfälten inom citattecken (" ").

Anmärkningar

En INSERT INTO-sats kan lägga till en enskild post i en tabell med ovanstående syntax. I det här fallet anges 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 deras motsvarande värden. Om du inte anger ett fältvärde kommer det att tilldelas ett standardvärde eller NULL. Poster läggs till i slutet av tabellen.

Du kan också använda INSERT INTO-satsen 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 Syntax för multipla postfrågor). I det här fallet anger SELECT-satsen de fält som ska läggas till i det angivna målobjekt.

Källa eller målobjekt 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.

Användningen av INSERT INTO-satsen är valfri. Om det finns måste det föregå SELECT-satsen.

Om måltabellen innehåller en primärnyckel, se till att värdena som läggs till i ett eller flera primärnyckelfält är unika och skiljer sig från NULL; annars kommer inga poster att läggas till.

Om poster läggs till i en tabell med ett Count-fält och du vill numrera om dem, inkludera inte fältet Count i frågan. Inkludera fältet "Räknare" i frågan om du vill behålla 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 få en fråga för att skapa en tabell.

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

En tilläggsfråga kopierar poster från en eller flera tabeller till en annan tabell. Samtidigt 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 listan över fält utelämnas måste VALUES-satsen inkludera motsvarande värden för varje fält i tabellen; annars misslyckas INSERT-operationen. Använd INSERT INTO-satsen tillsammans med VALUES-satsen för varje ytterligare post som du vill skapa.

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 handlar om INSERT-satsen, och de andra två satserna diskuteras i nästa artikel.

INFOGA uttalande 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 uttalandet 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 tabellen. Den lagrade proceduren måste returnera data som ska infogas i tabellen. När den används med en INSERT-sats kan SELECT-satsen 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.

En rad insats

För båda formerna av INSERT-satsen är en explicit lista med kolumner valfri. Frånvaron av en lista med kolumner motsvarar att specificera alla kolumner i tabellen.

DEFAULT VALUES parameter infogar standardvärden för alla kolumner. Kolumner med en TIMESTAMP-datatyp eller IDENTITY-egenskap 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 finns, eller NULL annars. Om nullvärden inte är tillåtna för en kolumn och inget standardvärde är definierat för kolumnen, misslyckas INSERT-satsen och ett lämpligt meddelande visas.

Följande exempel infogar rader i Employee-tabellen i SampleDb-databasen, och visar hur man använder INSERT-satsen för att infoga en liten mängd data i databasen:

ANVÄND SampleDb; INSERT INTO Employee VALUES(34990, "Andrey", "Batonov", "d1"); INSERT INTO Employee VALUES(38640, "Aleksey", "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 NULL-värdet i lämplig kolumn:

ANVÄND SampleDb; INSERT INTO Employee VALUES(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. Kolumner som inte anges måste antingen tillåta NULL-värden eller måste ha ett standardvärde definierat för dem.

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 för alla andra kolumner förbjöds detta värde av NOT NULL-satsen i CREATE TABLE-satsen.

Värdeordning i meningsVÄRDEN INSERT-satser kan skilja sig från den ordning som anges i CREATE TABLE-satsen. I ett sådant fall måste deras ordning matcha den ordning i vilken motsvarande kolumner är listade i kolumnlistan. Följande ä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");

Infoga flera rader

Den andra formen av INSERT-satsen infogar en eller flera rader valda av underfrågan i tabellen. Exemplet nedan visar hur man infogar rader i en tabell med den andra formen av INSERT-satsen. I det här fallet utförs en fråga för att välja nummer och namn på avdelningar i Moskva och ladda den resulterande uppsättningen 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 värdet på kolumnen 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 fråga för att hämta personalnummer, projektnummer och projektstartdatum för alla anställda med positionen "Manager" som arbetar på p2-projektet, och sedan laddar den resulterande uppsättningen in 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 datarader skulle nya rader läggas till i den.