Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

CHÈN SQL VÀO… CHỌN Ví dụ

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cải thiện hỗ trợ cho việc xây dựng lại số liệu thống kê song song

  2. Lập mô hình cấu trúc dữ liệu cơ bản để quản lý người dùng, chủ đề và bài đăng

  3. Điều tra lỗi ORA 028513 DG4ODBC

  4. Các kiểu dữ liệu SQL:5 lựa chọn tồi tệ nhất bạn cần dừng ngay hôm nay

  5. Hợp nhất các tệp dữ liệu với Statistica, Phần 2