Database
 sql >> база данни >  >> RDS >> Database

SQL СЪЗДАВАНЕ НА ТАБЛИЦА... КАТО Инструкция SELECT

SQL CREATE TABLE ... AS SELECT операторът ви позволява да вмъкнете резултатите от заявка в нова таблица.

Основен пример

Ето основен пример за демонстриране на избор и вмъкване на данните в нова таблица.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Това създава нова таблица, наречена Pets2 (със същата дефиниция като Pets ) и вмъква резултатите от заявката в него.

SQL стандартът изисква скоби около клаузата за подзаявка, но те може да са по избор във вашата СУБД (например PostgreSQL).

Ако изберем и двете таблици, можем да видим, че и двете имат едни и същи данни.

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)

Когато таблицата вече съществува

Ако се опитаме да изпълним CREATE TABLE ... AS SELECT отново получаваме грешка, поради вече съществуващата таблица.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Резултат:

relation "pets2" already exists

Ако искате да вмъкнете данни в таблица, която вече съществува, използвайте INSERT INTO... SELECT изявление. Това ще добави данните към всички съществуващи данни. Тоест ще добавя нови редове към таблицата, като запазва всички съществуващи редове.

Филтриране на резултатите

SELECT оператор може да направи обичайния SELECT неща, като например филтриране на резултатите с WHERE клауза.

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

В този пример филтрирам данните само за тези домашни любимци, които имат дата на раждане (DOB) от преди 1 юни 2020 г.

Избиране от множество таблици

Можете да изберете данни от множество таблици, след което дефиницията на таблицата местоназначение да се базира на набора от резултати.

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

Тук правим заявка за три таблици и вмъкваме резултатите в таблица, наречена PetsTypesOwners .

Имайте предвид, че изброих всяка колона тук, защото не исках да включвам всички колони.

По-конкретно, не исках да удвоявам колоните за външен ключ/първичен ключ. В моя случай външните ключове споделят същите имена като техните двойници на първичния ключ в родителската таблица и бих получил грешка поради създаване на дублиращи се имена на колони в таблицата местоназначение.

Ето какво имам предвид.

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

Резултат:

column "pettypeid" specified more than once

Ако вашите външни ключове използват различни имена на колони спрямо първичните ключове, тогава вероятно ще се окажете с целева таблица, която съдържа ненужни колони (една за първичния ключ, една за външния ключ и всяка съдържаща едни и същи стойности).

Ако наистина искате да включите такива дублиращи се колони, но те споделят едно и също име, винаги можете да използвате псевдоними, за да им присвоите различно име в целевата таблица.

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

В този случай използвах псевдоними на колони, за да пренастроя името на две колони на PetOwnerId и PetPetTypeId .

Поддръжка на СУБД

Въпреки че CREATE TABLE ... AS SELECT изразът отговаря на SQL стандарта, той не се поддържа от всички СУБД. Освен това за тези, които го поддържат, има вариации около прилагането му.

Затова предлагам да проверите с документацията на вашата СУБД, ако искате да използвате това изявление.

Ако използвате SQL Server, можете да използвате SELECT INTO изявление, което по същество прави същото.

Има и INSERT INTO ... SELECT твърдение, което много СУБД поддържат. Този израз вмъква резултатите от заявката в съществуваща таблица.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е персонализирано изображение по време на изпълнение в Java 9?

  2. Как да работим с наследяване в ядрото на Entity Framework

  3. Как да инсталирам SQLcl на Windows?

  4. Въведение в SQL

  5. Как да накарате вашата база данни да говори много езици?