INSERT ... SELECT: Chèn dữ liệu từ truy vấn SELECT
Không cần VALUES. Cú pháp INSERT INTO bang1 (cot...) SELECT cot... FROM bang2 WHERE ... copy dữ liệu giữa các bảng.
Cú pháp
INSERT INTO bangMucTieu (cot1, cot2, ...)
SELECT cot1, cot2, ...
FROM bangNguon
WHERE dieu_kien;
Ví dụ minh họa
Tạo 2 bảng:
CREATE TABLE FirstTableDemo (StudentId INT, StudentName VARCHAR(100));
CREATE TABLE SecondTableDemo (Id INT, Name VARCHAR(100));
Chèn dữ liệu vào bảng nguồn:
INSERT INTO SecondTableDemo VALUES (1,'John'), (2,'Sam');
Copy sang bảng đích (tránh trùng ID):
INSERT INTO FirstTableDemo (StudentId, StudentName)
SELECT Id, Name FROM SecondTableDemo AS tbl1
WHERE tbl1.Id NOT IN (SELECT StudentId FROM FirstTableDemo);
Kết quả
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1 | John |
| 2 | Sam |
+-----------+-------------+
Các trường hợp dùng thường gặp
- Backup/bảng tạm:
CREATE TABLE backup AS SELECT * FROM goc; - ETL: Chuyển đổi dữ liệu khi chèn (
SELECT UPPER(name), YEAR(dob)...). - Phân vùng dữ liệu: Chèn vào bảng partition theo tháng/năm.
Lưu ý
- Số cột và kiểu dữ liệu SELECT phải khớp với danh sách cột INSERT.
- Không dùng
VALUESkhi dùngSELECT. - Có thể dùng
INSERT IGNOREhoặcON DUPLICATE KEY UPDATEđể xử lý trùng khóa.