SQL CREATE TABLE ... AS SELECT
câu lệnh cho phép bạn chèn kết quả của một truy vấn vào một bảng mới.
Ví dụ cơ bản
Dưới đây là một ví dụ cơ bản để chứng minh việc chọn và chèn dữ liệu vào một bảng mới.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Thao tác này tạo một bảng mới có tên Pets2
(cùng định nghĩa với Pets
), và chèn kết quả truy vấn vào đó.
Tiêu chuẩn SQL yêu cầu dấu ngoặc đơn xung quanh mệnh đề truy vấn con, nhưng chúng có thể là tùy chọn trong DBMS của bạn (ví dụ:PostgreSQL).
Nếu chúng tôi chọn cả hai bảng, chúng tôi có thể thấy cả hai đều có cùng dữ liệu.
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)
Khi bảng đã tồn tại
Nếu chúng tôi cố gắng chạy CREATE TABLE ... AS SELECT
một lần nữa, chúng tôi gặp lỗi, do bảng đã tồn tại.
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
Kết quả:
relation "pets2" already exists
Nếu bạn muốn chèn dữ liệu vào một bảng đã tồn tại, hãy sử dụng INSERT INTO... SELECT
tuyên bố. Điều này sẽ nối dữ liệu vào bất kỳ dữ liệu hiện có nào. Nghĩa là, nó sẽ thêm các hàng mới vào bảng, trong khi vẫn giữ bất kỳ hàng nào hiện có.
Lọc kết quả
SELECT
câu lệnh có thể thực hiện SELECT
thông thường nội dung câu lệnh, chẳng hạn như lọc kết quả bằng WHERE
mệnh đề.
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
Trong ví dụ này, tôi lọc dữ liệu để chỉ những vật nuôi có ngày sinh (DOB) từ trước ngày 1 tháng 6 năm 2020.
Chọn từ nhiều bảng
Bạn có thể chọn dữ liệu từ nhiều bảng, sau đó đặt định nghĩa của bảng đích dựa trên tập kết quả.
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);
Ở đây, chúng tôi truy vấn ba bảng và chèn kết quả vào một bảng có tên PetsTypesOwners
.
Lưu ý rằng tôi đã liệt kê ra từng cột ở đây vì tôi không muốn bao gồm tất cả các cột.
Cụ thể, tôi không muốn nhân đôi các cột khóa ngoại / khóa chính. Trong trường hợp của tôi, các khóa ngoại có cùng tên với các đối tác khóa chính của chúng trong bảng mẹ và tôi sẽ nhận được lỗi do tên cột trùng lặp được tạo trong bảng đích.
Đây là ý tôi muốn nói.
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);
Kết quả:
column "pettypeid" specified more than once
Nếu khóa ngoại của bạn sử dụng các tên cột khác nhau cho khóa chính, thì có thể bạn sẽ kết thúc với một bảng đích chứa các cột không cần thiết (một cho khóa chính, một cho khóa ngoại và mỗi cột chứa các giá trị giống nhau).
Nếu bạn thực sự muốn bao gồm các cột trùng lặp như vậy, nhưng chúng có cùng tên, bạn luôn có thể sử dụng bí danh để gán chúng với một tên khác trong bảng đích.
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);
Trong trường hợp này, tôi đã sử dụng bí danh cột để gán lại tên của hai cột thành PetOwnerId
và PetPetTypeId
.
Hỗ trợ DBMS
Mặc dù CREATE TABLE ... AS SELECT
câu lệnh tuân theo tiêu chuẩn SQL, nó không được hỗ trợ bởi tất cả các DBMS. Ngoài ra, đối với những người hỗ trợ nó, có những biến thể xung quanh việc triển khai nó.
Do đó, tôi khuyên bạn nên kiểm tra tài liệu DBMS của mình nếu bạn muốn sử dụng câu lệnh này.
Nếu bạn sử dụng SQL Server, bạn có thể sử dụng SELECT INTO
, về cơ bản thực hiện điều tương tự.
Ngoài ra còn có INSERT INTO... SELECT
tuyên bố rằng nhiều DBMS hỗ trợ. Câu lệnh này chèn kết quả truy vấn vào một bảng hiện có.