Infoga i syntax. SQL INSERT INTO SELECT-sats. Exempel på sql-fråga INSERT INTO i en MySQL-databas

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

sql-frågan INSERT INTO är vettigt när en databastabell har skapats. Det vill säga att tabellen finns, har ett namn, skapat rader och kolumner. tabellen skapas av operatören: , tabellen ändras av operatören .

sql-fråga INSERT INTO - frågesyntax

sql-frågan INSERT INTO har följande syntax:

INSERT INTO tabellnamn (inom parentes, infoga vid behov en lista med kolumner där du vill infoga data) VÄRDEN infogade data1, infogade data2, infogade data3.

Du kan infoga ett IGNORE-alternativ mellan INSERT och INTRO. Det krävs inte. Behövs för att skydda primärnycklar vid redigering av en tabell. Annars, om duplicering av primärnycklar inträffar under redigering, när du infogar alternativet IGNORE, kommer den första raden med primärnyckeln att finnas kvar i tabellen som redigeras. Andra primärnycklar kommer att raderas. Som standard utelämnar vi det här alternativet.

Det finns valfria alternativ LOW_PRIORITY och DELAYED. De bestämmer prioriteringarna för att lägga till information till databasen. Den första anger att vänta på att databasen ska släppas, den andra betyder buffring av information.

Raden i frågan: INSERT med VALUES-frasen låter dig lägga till en enda rad i databastabellen. VALUES-satsen innehåller värdena för denna data.

Undersökningar kan anges istället för VALUES-frasen. INSERT med en underfråga lägger till raderna som returneras av underfrågan till tabellen. Databasservern bearbetar underfrågan och infogar alla returnerade rader i tabellen. Servern infogar inte rader om inte underfrågan väljer dem.

  • subquery_1 - en subquery som servern bearbetar på samma sätt som vyn
  • subquery_2 är en subquery som returnerar rader infogade i tabellen. Listan med denna underfråga måste ha samma antal kolumner som INSERT kolumnlistan.

Undersökningar används praktiskt taget inte i en MySQL-databas.

Exempel på sql-fråga INSERT INTO i en MySQL-databas

Vi infogar nya rader i MySQL-databasen med kommandot INSERT INTRO.

Första exemplet.

Infoga nya rader i tabellen tabellnamn.

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

Det betyder att vi vill infoga värdena 2,145,1,namn i tabellen table_name kolumner. Eftersom kolumnerna inte är specificerade fylls värdena i alla kolumner i tabellen.

Exempel två.

Infoga information i de obligatoriska (specificerade) kolumnerna i tabellen tabellnamn.

INFOGA I tabellnamn (klient_kund, klient_underklient, klient_post) VÄRDEN ('namn1','undernamn1',' [e-postskyddad]′), (‘namn2′,’undernamn2′,’ [e-postskyddad]′), (‘namn3′,’undernamn3′,(’ [e-postskyddad]′);

Igor Serov speciellt för webbplatsen "".

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.

Vad är INSERT INTO?

Huvudmålet med databassystem är att lagra data i tabellerna. Datan tillhandahålls vanligtvis av applikationsprogram som körs ovanpå databasen. För detta ändamål har SQL kommandot INSERT som används för att lagra data i en tabell. De INSERT-kommandot skapar en ny rad i tabellen för att lagra data.

Grundläggande syntax

Låt oss titta på den grundläggande syntaxen för kommandot SQL INSERT som visas nedan.

INSERT INTO `tabellnamn` (kolumn_1, kolumn_2,...) VÄRDEN (värde_1, värde_2,...);

  • INFOGA I `tabellnamn`är kommandot som säger till MySQL-servern att lägga till en ny rad i en tabell som heter `tabellnamn`.
  • (kolumn_1, kolumn_2,...) anger kolumnerna som ska uppdateras i den nya raden
  • VÄRDEN (värde_1, värde_2,...) anger de värden som ska läggas till i den nya raden

När du tillhandahåller datavärdena som ska infogas i den nya tabellen, bör följande beaktas när du hanterar olika datatyper.

  • Strängdatatyper- alla strängvärden ska omges av enkla citattecken.
  • Numeriska datatyper- alla numeriska värden ska tillhandahållas direkt utan att omge dem i enkla eller dubbla citattecken.
  • Datumdatatyper- bifoga datumvärden i enstaka citattecken i formatet "ÅÅÅÅ-MM-DD".

Exempel:

Anta att vi har följande lista över nya biblioteksmedlemmar som behöver läggas till i databasen.

Fullständiga namn Födelsedatum kön Fysisk adress postadress Kontaktnummer E-postadress
Leonard Hofstadter Manlig Woodcrest 0845738767
Sheldon Cooper Manlig Woodcrest 0976736763
Rajesh Koothrappali Manlig Fairview 0938867763
Leslie Winkle 14/02/1984 Manlig 0987636553
Howard Wolowitz 24/08/1981 Manlig South Park P.O. Box 4563 0987786553

Låter" INFOGA data en efter en. Vi börjar med Leonard Hofstadter. Vi kommer att behandla kontaktnumret som en numerisk datatyp och inte omge numret i enstaka citattecken.

INSERT INTO `members` (`fullständiga_namn`,`gender`,`physical_address`,`contact_number`) VALUES ("Leonard Hofstadter","Man","Woodcrest",0845738767);

Genom att köra ovanstående skript tappas nollan från Leonards kontaktnummer. Detta beror på att värdet kommer att behandlas som ett numeriskt värde och nollan (0) i början tas bort eftersom den inte är signifikant.

För att undvika sådana problem måste värdet inkluderas i enkla citattecken som visas nedan -

INSERT INTO `members` (`fullständiga_namn`,`gender`,`physical_address`,`contact_number`) VÄRDEN ("Sheldon Cooper","Man","Woodcrest", "0976736763");

I ovanstående fall kommer noll(0) inte att tas bort

Att ändra ordningen på kolumnerna har ingen effekt på INSERT-frågan så länge de korrekta värdena har mappats till rätt kolumner.

Frågan som visas nedan visar punkten ovan.

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

Ovanstående frågor hoppade över kolumnen för födelsedatum, som standard kommer MySQL att infoga NULL-värden i kolumner som hoppas över i INSERT-frågan.

Låt oss nu infoga posten för Leslie som har födelsedatumet angett. Datumvärdet ska omges av enkla citattecken med formatet "ÅÅÅÅ-MM-DD".

INSERT INTO `members` (`fullständiga_namn`,`date_of_birth`,`gender`,`physical_address`,`contact_number`) VÄRDEN ("Leslie Winkle","1984-02-14","Male","Woodcrest"," 0987636553");

Alla ovanstående frågor specificerade kolumnerna och mappade dem till värden i insert-satsen. Om vi ​​tillhandahåller värden för ALLA kolumner i tabellen, kan vi utelämna kolumnerna från infogningsfrågan.

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

Låt oss nu använda SELECT-satsen för att se alla rader i medlemstabellen. SELECT * FROM `members`;

medlemsnummerFullständiga namnkönfödelsedatumfysisk adresspostadresskontaktnummere-post
1 Janet JonesKvinna21-07-1980 First Street Tomt nr 4Privat väska0759 253 542 Den här e-postadressen skyddas från spambots. Du måste ha Javascript aktiverat för att se det.
2 Janet Smith JonesKvinna23-06-1980 Melrose 123NULLNULLDen här e-postadressen skyddas från spambots. Du måste ha Javascript aktiverat för att se det.
3 Robert PhilManlig12-07-1989 3rd Street 34NULL12345 Den här e-postadressen skyddas från spambots. Du måste ha Javascript aktiverat för att se det.
4 Gloria WilliamsKvinna14-02-1984 2nd Street 23NULLNULLNULL
5 Leonard HofstadterManligNULLWoodcrestNULL845738767 NULL
6 Sheldon CooperManligNULLWoodcrestNULL976736763 NULL
7 Rajesh KoothrappaliManligNULLWoodcrestNULL938867763 NULL
8 Leslie WinkleManlig14-02-1984 WoodcrestNULL987636553 NULL
9 Howard WolowitzManlig24-08-1981 SouthParkP.O. Box 4563987786553 Den här e-postadressen skyddas från spambots. Du måste ha Javascript aktiverat för att se det.

Observera att kontaktnumret för Leonard Hofstadter har tagit bort nollan (0) från kontaktnumret. De andra kontaktnumren har inte sjunkit nollan (0) i början.

Infoga i en tabell från en annan tabell

Kommandot INSERT kan också användas för att infoga data i en tabell från en annan tabell. Den grundläggande syntaxen är som visas nedan.

INSERT INTO table_1 SELECT * FROM table_2;

Låt oss nu titta på ett praktiskt exempel, vi kommer att skapa en dummy-tabell för filmkategorier för demonstrationsändamål. Vi kommer att kalla de nya kategorierna tabellen kategorier_arkiv. Skriptet som visas nedan skapar tabellen.

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`))

Utför skriptet ovan för att skapa tabellen.

Låt oss nu infoga alla rader från kategoritabellen i kategoriarkivtabellen. Skriptet som visas nedan hjälper oss att uppnå det.

INSERT INTO `categories_archive` SELECT * FRÅN `kategorier`;

Genom att köra ovanstående skript infogas alla rader från kategoritabellen i kategoriarkivtabellen. Observera att tabellstrukturerna måste vara desamma för att skriptet ska fungera. Ett mer robust skript är ett som mappar kolumnnamnen i infogningstabellen till de i tabellen som innehåller data.

Frågan som visas nedan visar dess användning.

INSERT INTO `categories_archive`(category_id,category_name,remarks) SELECT category_id,category_name,kommentarer FRÅN `kategorier`;

Kör SELECT-frågan

VÄLJ * FRÅN `categories_archive`

ger följande resultat som visas nedan.

kategori_idkategori namnanmärkningar
1 KomediFilmer med humor
2 RomantiskKärlekshistorier
3 EpiskBerättelser om gamla filmer
4 SkräckNULL
5 Science fictionNULL
6 ThrillerNULL
7 HandlingNULL
8 Romantisk komediNULL
9 Tecknade serierNULL
10 Tecknade serierNULL

Sammanfattning

  • Kommandot INSERT används för att lägga till ny data i en tabell
  • Datum- och strängvärdena bör omges av enkla citattecken.
  • De numeriska värdena behöver inte stå inom citattecken.
  • Kommandot INSERT kan också användas för att infoga data från en tabell till en annan.

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 diskuterar INSERT-satsen, och de andra två satserna diskuteras 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 Employee-tabellen 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 infoga värden i ny linje. 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 Employee-tabellen ä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.


Topp