sql >> Databasteknik >  >> RDS >> Database

SQL INSERT INTO... VÄLJ Exempel

SQL INSERT uttalande används oftast för att infoga enskilda rader i en tabell.

Men du kan också infoga resultaten av en fråga i en tabell. Det betyder att du kan infoga flera rader samtidigt (så länge de returneras av frågan).

Grundläggande exempel

Här är ett grundläggande exempel att visa.

INSERT INTO Pets2
SELECT * FROM Pets;

Det infogar alla rader från Pets tabell till Pets2 bord.

Det förutsätter att vi redan har skapat Pets2 tabell och att den har rätt definition.

Om det inte finns eller om det inte har rätt definition får du ett felmeddelande.

Infoga data från flera tabeller

Du kan använda den här metoden för att infoga data från flera tabeller.

INSERT INTO PetsTypesOwners
SELECT 
    p.PetId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

I det här exemplet infogade jag data från tre tabeller i en tabell som heter PetsTypesOwners .

Observera att jag uttryckligen listade varje kolumn. Jag gjorde detta eftersom målkolumnen har färre kolumner än de tre tabellerna tillsammans. I det här fallet beror det på att om jag hade valt alla kolumner skulle frågan ha returnerat dubbletter av kolumner på grund av att främmande nycklar har samma namn och värde som deras primärnycklar.

Om jag vill inkludera de dubblettkolumnerna, skulle målkolumnen behöva inkludera de dubblettkolumnerna, men med ett annat namn för en av varje dubblettpar.

Här är ett exempel på hur du väljer alla kolumner (jag väljer dem explicit här, så att du kan se deras namn):

INSERT INTO PetsTypesOwners2
SELECT 
    p.PetId, 
    p.OwnerId, 
    p.PetTypeId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Du kan se att det finns två kolumner som heter OwnerId och två kallas PetTypeId , var och en från olika bord. Dessa är primärnycklarna och främmande nycklar för deras respektive tabeller.

Eftersom dessa kolumner är dubbletter inkluderade jag bara en av varje i föregående exempel. Men för syftet med denna demo har jag inkluderat dem i det här exemplet.

Så för att tillgodose denna nya INSERT INTO... SELECT sats, behöver vi att vår destinationstabell har rätt antal kolumner och med en kompatibel definition.

Därför kan vår destinationstabells definition se ut ungefär så här:

CREATE TABLE PetsTypesOwners2 (
    PetId       int NOT NULL PRIMARY KEY,
    PetPetType  varchar(60) NOT NULL,
    PetOwnerId  int NOT NULL,
    PetName     varchar(60) NOT NULL,
    DOB         date NULL,
    PetTypeId   int NOT NULL,
    PetType     varchar(60) NOT NULL,
    OwnerId     int NOT NULL,
    FirstName   varchar(60) NOT NULL,
    LastName    varchar(60) NOT NULL,
    Phone       varchar(20) NOT NULL,
    Email       varchar(254)
);

I det här fallet prefixerade jag en av varje dubblettkolumn med Pet . Specifikt skapade jag ett PetPetTypeId (som mappas till p.OwnerId kolumnen i frågan) och PetOwnerId kolumn (som mappas till p.PetTypeId kolumn i frågan).

Det är dock viktigt att notera att det inte spelar någon roll vad du kallar dina kolumner i destinationstabellen. INSERT INTO... SELECT uttalandet bryr sig inte om det. INSERT INTO... SELECT uttalandet är bara intresserad av kolumnordningen.

Infoga data från en vy

Du kan använda samma INSERT INTO... SELECT syntax för att infoga data i en tabell från en vy.

Här är ett snabbt exempel:

INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;

I det här fallet, vPetTypeCount är en vy, och jag infogar dess innehåll i en tabell som heter PetTypeCount .

Infoga data från en lagrad procedur

Vissa DBMS:er (som SQL Server) kan också använda samma INSERT INTO... SELECT syntax för att infoga data i en tabell från en lagrad procedur.

Här är ett snabbt exempel:

INSERT INTO PetById
EXEC uspGetPetById 2;

Återigen, detta förutsätter att vi har en destinationstabell med korrekt definition.

Koden SELECT INTO Uttalande

Beroende på ditt DBMS finns det också en SELECT INTO uttalande, som du kan använda för att automatiskt skapa en ny tabell baserat på resultatuppsättningen, och sedan infoga den resultatuppsättningen i den.


  1. Hur lagras datum i Oracle?

  2. Hur man distribuerar PostgreSQL till en Docker-container med ClusterControl

  3. Varför producerar en parameteriserad fråga mycket långsammare frågeplan jämfört med icke-parameteriserad fråga

  4. Hur UTC_DATE() fungerar i MariaDB