Database
 sql >> Baza danych >  >> RDS >> Database

SQL CREATE TABLE … Instrukcja AS SELECT

SQL CREATE TABLE ... AS SELECT instrukcja umożliwia wstawienie wyników zapytania do nowej tabeli.

Przykład podstawowy

Oto podstawowy przykład demonstrujący wybieranie i wstawianie danych do nowej tabeli.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Spowoduje to utworzenie nowej tabeli o nazwie Pets2 (z taką samą definicją jak Pets ) i wstawia do niego wyniki zapytania.

Standard SQL wymaga nawiasów wokół klauzuli podzapytania, ale mogą one być opcjonalne w Twoim DBMS (na przykład PostgreSQL).

Jeśli wybierzemy obie tabele, zobaczymy, że obie mają te same dane.

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)

Kiedy tabela już istnieje

Jeśli spróbujemy uruchomić CREATE TABLE ... AS SELECT ponownie, otrzymujemy błąd, ponieważ tabela już istnieje.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Wynik:

relation "pets2" already exists

Jeśli chcesz wstawić dane do tabeli, która już istnieje, użyj INSERT INTO... SELECT oświadczenie. Spowoduje to dodanie danych do wszelkich istniejących danych. Oznacza to, że doda nowe wiersze do tabeli, zachowując wszystkie istniejące.

Filtrowanie wyników

SELECT instrukcja może wykonać zwykły SELECT instrukcje, takie jak filtrowanie wyników za pomocą WHERE klauzula.

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

W tym przykładzie filtruję dane tylko do tych zwierząt, które mają datę urodzenia (DOB) sprzed 1 czerwca 2020 r.

Wybieranie z wielu tabel

Możesz wybrać dane z wielu tabel, a następnie ustawić definicję tabeli docelowej na zestawie wyników.

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

Tutaj wysyłamy zapytanie do trzech tabel i wstawiamy wyniki do tabeli o nazwie PetsTypesOwners .

Zwróć uwagę, że wymieniłem tutaj każdą kolumnę, ponieważ nie chciałem uwzględniać wszystkich kolumn.

W szczególności nie chciałem podwajać kolumn klucza obcego/klucza podstawowego. W moim przypadku klucze obce mają te same nazwy, co ich odpowiedniki w kluczu podstawowym w tabeli nadrzędnej i otrzymałbym błąd z powodu tworzenia zduplikowanych nazw kolumn w tabeli docelowej.

Oto, co mam na myśli.

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

Wynik:

column "pettypeid" specified more than once

Jeśli twoje klucze obce używają innych nazw kolumn niż klucze podstawowe, prawdopodobnie skończysz z tabelą docelową, która zawiera niepotrzebne kolumny (jedna dla klucza podstawowego, jedna dla klucza obcego, a każda zawiera te same wartości).

Jeśli naprawdę chcesz uwzględnić takie zduplikowane kolumny, ale mają one tę samą nazwę, zawsze możesz użyć aliasów, aby przypisać im inną nazwę w tabeli docelowej.

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

W tym przypadku użyłem aliasów kolumn, aby przypisać nazwy dwóch kolumn do PetOwnerId i PetPetTypeId .

Obsługa DBMS

Chociaż CREATE TABLE ... AS SELECT instrukcja jest zgodna ze standardem SQL, nie jest obsługiwana przez wszystkie DBMS. Ponadto dla tych, którzy go obsługują, istnieją różne warianty jego implementacji.

Dlatego sugeruję sprawdzenie w dokumentacji DBMS, jeśli chcesz użyć tego oświadczenia.

Jeśli używasz SQL Server, możesz użyć SELECT INTO oświadczenie, które w zasadzie robi to samo.

Jest też INSERT INTO ... SELECT oświadczenie, które obsługuje wiele DBMS. Ta instrukcja wstawia wyniki zapytania do istniejącej tabeli.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak tworzyć liczby pięter w SQL

  2. Polecenia RMAN kończą się niepowodzeniem z ORA-00904:„BS”. „GUID”:nieprawidłowy identyfikator

  3. 10 najważniejszych powodów, dla których powinieneś uczyć się SQL

  4. Używanie Jenkinsa z Kubernetes AWS, część 2

  5. Twój ostateczny przewodnik po SQL Join:INNER JOIN – część 1