SQL-koden CREATE TABLE ... AS SELECT
satsen gör att du kan infoga resultaten av en fråga i en ny tabell.
Grundläggande exempel
Här är ett grundläggande exempel för att visa hur du väljer och infogar data i en ny tabell.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Detta skapar en ny tabell som heter Pets2
(med samma definition som Husdjur
), och infogar frågeresultaten i den.
SQL-standarden kräver parenteser runt subquery-satsen, men de kan vara valfria i ditt DBMS (till exempel PostgreSQL).
Om vi väljer båda tabellerna kan vi se att de båda har samma data.
barney=# SELECT * FROM Pets;
petid | pettypeid | ownerid | petname | dob
-------+-----------+---------+---------+------------
1 | 2 | 3 | Fluffy | 2020-11-20
2 | 3 | 3 | Fetch | 2019-08-16
3 | 2 | 2 | Scratch | 2018-10-01
4 | 3 | 3 | Wag | 2020-03-15
5 | 1 | 1 | Tweet | 2020-11-28
6 | 3 | 4 | Fluffy | 2020-09-17
7 | 3 | 2 | Bark |
8 | 2 | 4 | Meow |
(8 rows)
barney=# SELECT * FROM Pets2;
petid | pettypeid | ownerid | petname | dob
-------+-----------+---------+---------+------------
1 | 2 | 3 | Fluffy | 2020-11-20
2 | 3 | 3 | Fetch | 2019-08-16
3 | 2 | 2 | Scratch | 2018-10-01
4 | 3 | 3 | Wag | 2020-03-15
5 | 1 | 1 | Tweet | 2020-11-28
6 | 3 | 4 | Fluffy | 2020-09-17
7 | 3 | 2 | Bark |
8 | 2 | 4 | Meow |
(8 rows)
När tabellen redan finns
Om vi försöker köra CREATE TABLE ... AS SELECT
uttalande igen, får vi ett fel, på grund av att tabellen redan finns.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Resultat:
relation "pets2" already exists
Om du vill infoga data i en tabell som redan finns, använd INSERT INTO... SELECT
påstående. Detta kommer att lägga till data till alla befintliga data. Det vill säga, det kommer att lägga till nya rader i tabellen, samtidigt som alla befintliga rader behålls.
Filtrera resultaten
SELECT
uttalande kan göra den vanliga SELECT
satser, som att filtrera resultaten med en WHERE
klausul.
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
I det här exemplet filtrerar jag data till bara de husdjur som har ett födelsedatum (DOB) från före den 1 juni 2020.
Välja från flera tabeller
Du kan välja data från flera tabeller och sedan låta destinationstabellens definition baseras på resultatuppsättningen.
CREATE TABLE PetsTypesOwners AS
(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);
Här frågar vi tre tabeller och infogar resultaten i en tabell som heter PetsTypesOwners
.
Observera att jag listade varje kolumn här eftersom jag inte ville inkludera alla kolumner.
Specifikt ville jag inte dubbla upp kolumnerna för främmande nyckel/primärnyckel. I mitt fall delar de främmande nycklarna samma namn som deras motsvarigheter för primärnyckeln i den överordnade tabellen, och jag skulle ha fått ett felmeddelande på grund av att dubbla kolumnnamn skapades i destinationstabellen.
Det här är vad jag menar.
CREATE TABLE PetsTypesOwners2 AS
(SELECT *
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId);
Resultat:
column "pettypeid" specified more than once
Om dina främmande nycklar använder olika kolumnnamn än de primära nycklarna, skulle du förmodligen sluta med en destinationstabell som innehåller onödiga kolumner (en för primärnyckeln, en för den främmande nyckeln och var och en innehåller samma värden).
Om du verkligen vill inkludera sådana dubbletter av kolumner, men de delar samma namn, kan du alltid använda alias för att tilldela dem ett annat namn i destinationstabellen.
CREATE TABLE PetsTypesOwners2 AS
(SELECT
p.PetId,
p.OwnerId AS PetOwnerId,
p.PetTypeId AS PetPetTypeId,
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 fallet använde jag kolumnalias för att tilldela namnet på två kolumner till PetOwnerId
och PetPetTypeId
.
DBMS-stöd
Även om CREATE TABLE ... AS SELECT
satsen överensstämmer med SQL-standarden, den stöds inte av alla DBMS. Dessutom, för dem som stöder det, finns det variationer kring dess implementering.
Därför föreslår jag att du kontrollerar din DBMS-dokumentation om du vill använda detta uttalande.
Om du använder SQL Server kan du använda
Det finns också INSERT INTO ... SELECT
uttalande som många DBMS stödjer. Denna sats infogar frågeresultaten i en befintlig tabell.