sql >> Database teknologi >  >> RDS >> Database

SQL CREATE TABLE … SOM SELECT-sætning

SQL'en CREATE TABLE ... AS SELECT sætning giver dig mulighed for at indsætte resultaterne af en forespørgsel i en ny tabel.

Grundlæggende eksempel

Her er et grundlæggende eksempel til at demonstrere valg og indsættelse af data i en ny tabel.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Dette opretter en ny tabel kaldet Pets2 (med samme definition som Pets ), og indsætter forespørgselsresultaterne i den.

SQL-standarden kræver parenteser omkring underforespørgselssætningen, men de kan være valgfrie i dit DBMS (f.eks. PostgreSQL).

Hvis vi vælger begge tabeller, kan vi se, at de begge har de samme 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 allerede eksisterer

Hvis vi prøver at køre CREATE TABLE ... AS SELECT sætning igen, får vi en fejl, på grund af tabellen allerede eksisterende.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Resultat:

relation "pets2" already exists

Hvis du vil indsætte data i en tabel, der allerede eksisterer, skal du bruge INSERT INTO... SELECT udmelding. Dette vil tilføje dataene til alle eksisterende data. Det vil sige, at den tilføjer nye rækker til tabellen, mens de bevarer eksisterende rækker.

Filtrering af resultaterne

SELECT sætning kan gøre den sædvanlige SELECT sætningsting, såsom at filtrere resultaterne med en WHERE klausul.

CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');

I dette eksempel filtrerer jeg dataene til kun de kæledyr, der har en fødselsdato (DOB) fra før den 1. juni 2020.

Vælg fra flere tabeller

Du kan vælge data fra flere tabeller og derefter få destinationstabellens definition baseret på resultatsættet.

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

Her forespørger vi tre tabeller og indsætter resultaterne i en tabel kaldet PetsTypesOwners .

Bemærk, at jeg har angivet hver kolonne her, fordi jeg ikke ønskede at inkludere alle kolonner.

Specifikt ønskede jeg ikke at fordoble kolonnerne med fremmednøgle/primærnøgle. I mit tilfælde deler de fremmede nøgler de samme navne som deres primære nøglemodstykker i den overordnede tabel, og jeg ville have modtaget en fejl på grund af, at duplikerede kolonnenavne blev oprettet i destinationstabellen.

Her er hvad jeg mener.

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

Hvis dine fremmednøgler bruger forskellige kolonnenavne end de primære nøgler, vil du sandsynligvis ende med en destinationstabel, der indeholder unødvendige kolonner (en for den primære nøgle, en for den fremmede nøgle, og hver indeholder de samme værdier).

Hvis du virkelig ønsker at inkludere sådanne duplikerede kolonner, men de deler det samme navn, kan du altid bruge aliaser til at tildele dem et andet navn 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 dette tilfælde brugte jeg kolonnealiaser til at omtildele navnet på to kolonner til PetOwnerId og PetPetTypeId .

DBMS-understøttelse

Selvom CREATE TABLE ... AS SELECT sætningen er i overensstemmelse med SQL-standarden, den understøttes ikke af alle DBMS'er. Også for dem, der understøtter det, er der variationer omkring implementeringen.

Derfor vil jeg foreslå, at du tjekker din DBMS's dokumentation, hvis du vil bruge denne erklæring.

Hvis du bruger SQL Server, kan du bruge SELECT INTO statement, som stort set gør det samme.

Der er også INSERT INTO ... SELECT erklæring, som mange DBMS'er understøtter. Denne sætning indsætter forespørgselsresultaterne i en eksisterende tabel.


  1. Sammenlign datoer i MySQL

  2. postgresql - sql - antal "sande" værdier

  3. UTF-8 hele vejen igennem

  4. MariaDB JSON_MERGE_PRESERVE() Forklaret