Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

SQL CREATE TABLE ... SEBAGAI Pernyataan SELECT

SQL CREATE TABLE ... AS SELECT pernyataan memungkinkan Anda untuk menyisipkan hasil kueri ke dalam tabel baru.

Contoh Dasar

Berikut adalah contoh dasar untuk mendemonstrasikan pemilihan dan penyisipan data ke dalam tabel baru.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Ini membuat tabel baru bernama Pets2 (dengan definisi yang sama dengan Pets ), dan menyisipkan hasil kueri ke dalamnya.

Standar SQL memerlukan tanda kurung di sekitar klausa subquery, tetapi tanda kurung tersebut mungkin opsional di DBMS Anda (misalnya PostgreSQL).

Jika kita memilih kedua tabel, kita dapat melihat keduanya memiliki data yang sama.

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)

Bila Tabel Sudah Ada

Jika kita mencoba menjalankan CREATE TABLE ... AS SELECT pernyataan lagi, kami mendapatkan kesalahan, karena tabel sudah ada.

CREATE TABLE Pets2 AS
(SELECT * FROM Pets);

Hasil:

relation "pets2" already exists

Jika ingin menyisipkan data ke dalam tabel yang sudah ada, gunakan tombol INSERT INTO... SELECT penyataan. Ini akan menambahkan data ke data yang ada. Artinya, ini akan menambahkan baris baru ke tabel, sambil mempertahankan baris yang ada.

Memfilter Hasil

SELECT pernyataan dapat melakukan SELECT biasa hal-hal pernyataan, seperti memfilter hasil dengan WHERE klausa.

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

Dalam contoh ini, saya memfilter data hanya untuk hewan peliharaan yang memiliki tanggal lahir (DOB) sebelum 1 Juni 2020.

Memilih dari Beberapa Tabel

Anda dapat memilih data dari beberapa tabel, lalu membuat definisi tabel tujuan berdasarkan kumpulan hasil.

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

Di sini, kami membuat kueri tiga tabel dan memasukkan hasilnya ke dalam tabel bernama PetsTypesOwners .

Perhatikan bahwa saya mencantumkan setiap kolom di sini karena saya tidak ingin menyertakan semua kolom.

Secara khusus, saya tidak ingin menggandakan kolom kunci asing/kunci utama. Dalam kasus saya, kunci asing berbagi nama yang sama dengan rekan kunci utama mereka di tabel induk, dan saya akan menerima kesalahan karena nama kolom duplikat dibuat di tabel tujuan.

Inilah yang saya maksud.

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

Hasil:

column "pettypeid" specified more than once

Jika kunci asing Anda menggunakan nama kolom yang berbeda dengan kunci utama, maka Anda mungkin akan berakhir dengan tabel tujuan yang berisi kolom yang tidak perlu (satu untuk kunci utama, satu untuk kunci asing, dan masing-masing berisi nilai yang sama).

Jika Anda benar-benar ingin menyertakan kolom duplikat seperti itu, tetapi memiliki nama yang sama, Anda selalu dapat menggunakan alias untuk menetapkannya dengan nama yang berbeda di tabel tujuan.

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

Dalam hal ini saya menggunakan alias kolom untuk menetapkan kembali nama dua kolom menjadi PetOwnerId dan PetPetTypeId .

Dukungan DBMS

Meskipun CREATE TABLE ... AS SELECT pernyataan sesuai dengan standar SQL, tidak didukung oleh semua DBMS. Juga, bagi mereka yang mendukungnya, ada variasi dalam penerapannya.

Oleh karena itu, saya sarankan untuk memeriksa dokumentasi DBMS Anda jika Anda ingin menggunakan pernyataan ini.

Jika Anda menggunakan SQL Server, Anda dapat menggunakan SELECT INTO pernyataan, yang pada dasarnya melakukan hal yang sama.

Ada juga INSERT INTO ... SELECT pernyataan bahwa banyak DBMS mendukung. Pernyataan ini menyisipkan hasil kueri ke dalam tabel yang ada.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjebak Kesalahan Server Tertaut

  2. Menghubungkan Aplikasi 64-bit ke Clarion TopSpeed

  3. Urutan Predikat Penting dalam Acara yang Diperpanjang

  4. Bagaimana tidak Menampilkan Duplikat dalam SQL

  5. Normalisasi dan Performa Mode Batch