INSERT
trong SQL câu lệnh được sử dụng phổ biến nhất để chèn các hàng riêng lẻ vào bảng.
Nhưng bạn cũng có thể chèn kết quả của một truy vấn vào một bảng. Điều này có nghĩa là bạn có thể chèn nhiều hàng cùng một lúc (miễn là chúng được truy vấn trả về).
Ví dụ cơ bản
Đây là một ví dụ cơ bản để chứng minh.
INSERT INTO Pets2
SELECT * FROM Pets;
Điều đó sẽ chèn tất cả các hàng từ Pets
bảng thành Pets2
bảng.
Nó giả định rằng chúng tôi đã tạo Pets2
và nó có định nghĩa chính xác.
Nếu nó không tồn tại hoặc nếu nó không có định nghĩa chính xác, thì bạn sẽ gặp lỗi.
Chèn dữ liệu từ nhiều bảng
Bạn có thể sử dụng phương pháp này để chèn dữ liệu từ nhiều bảng.
INSERT INTO PetsTypesOwners
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;
Trong ví dụ này, tôi đã chèn dữ liệu từ ba bảng vào một bảng có tên là PetsTypesOwners
.
Lưu ý rằng tôi đã liệt kê rõ ràng từng cột. Tôi đã làm điều này vì cột đích có ít cột hơn ba bảng cộng lại. Trong trường hợp này, đó là bởi vì, nếu tôi đã chọn tất cả các cột, truy vấn sẽ trả về các cột trùng lặp do các khóa ngoại có cùng tên và giá trị với khóa chính của chúng.
Nếu tôi muốn bao gồm các cột trùng lặp đó, cột đích sẽ cần bao gồm các cột trùng lặp đó, nhưng với một tên khác cho một trong mỗi cặp trùng lặp.
Dưới đây là một ví dụ về việc chọn tất cả các cột (tôi sẽ chọn chúng một cách rõ ràng ở đây, vì vậy bạn có thể thấy tên của chúng):
INSERT INTO PetsTypesOwners2
SELECT
p.PetId,
p.OwnerId,
p.PetTypeId,
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;
Bạn có thể thấy rằng có hai cột được gọi là OwnerId
và hai được gọi là PetTypeId
, mỗi người từ một bảng khác nhau. Đây là các khóa chính và khóa ngoại của các bảng tương ứng.
Vì những cột đó là trùng lặp, tôi chỉ bao gồm một trong mỗi cột trong ví dụ trước. Nhưng với mục đích của bản trình diễn này, tôi đã đưa chúng vào ví dụ này.
Vì vậy, để phục vụ cho INSERT INTO... SELECT
mới này tuyên bố, chúng ta cần bảng đích của mình có số cột chính xác và có định nghĩa tương thích.
Do đó, định nghĩa của bảng đích của chúng tôi có thể trông giống như sau:
CREATE TABLE PetsTypesOwners2 (
PetId int NOT NULL PRIMARY KEY,
PetPetType varchar(60) NOT NULL,
PetOwnerId int NOT NULL,
PetName varchar(60) NOT NULL,
DOB date NULL,
PetTypeId int NOT NULL,
PetType varchar(60) NOT NULL,
OwnerId int NOT NULL,
FirstName varchar(60) NOT NULL,
LastName varchar(60) NOT NULL,
Phone varchar(20) NOT NULL,
Email varchar(254)
);
Trong trường hợp này, tôi đặt trước một trong mỗi cột trùng lặp bằng Pet
. Cụ thể, tôi đã tạo một PetPetTypeId
(ánh xạ tới p.OwnerId
trong truy vấn) và PetOwnerId
cột (ánh xạ tới p.PetTypeId
trong truy vấn).
Tuy nhiên, điều quan trọng cần lưu ý là bạn gọi các cột của mình trong bảng đích là gì không quan trọng. INSERT INTO... SELECT
tuyên bố không quan tâm đến điều đó. INSERT INTO... SELECT
câu lệnh chỉ quan tâm đến thứ tự cột.
Chèn dữ liệu từ một chế độ xem
Bạn có thể sử dụng cùng một INSERT INTO... SELECT
cú pháp để chèn dữ liệu vào bảng từ một dạng xem.
Dưới đây là một ví dụ nhanh:
INSERT INTO PetTypeCount
SELECT * FROM vPetTypeCount;
Trong trường hợp này, vPetTypeCount
là một chế độ xem và tôi đang chèn nội dung của nó vào một bảng có tên PetTypeCount
.
Chèn dữ liệu từ một thủ tục đã lưu trữ
Một số DBMS (chẳng hạn như SQL Server) cũng có thể sử dụng cùng một INSERT INTO... SELECT
cú pháp để chèn dữ liệu vào bảng từ một thủ tục được lưu trữ.
Dưới đây là một ví dụ nhanh:
INSERT INTO PetById
EXEC uspGetPetById 2;
Một lần nữa, điều này giả định rằng chúng ta có một bảng đích với định nghĩa chính xác.
SELECT INTO
Tuyên bố
Tùy thuộc vào DBMS của bạn, cũng có SELECT INTO
mà bạn có thể sử dụng để tự động tạo một bảng mới dựa trên tập kết quả, sau đó chèn tập kết quả đó vào.