1. Giới thiệu
Câu lệnh INSERT INTO SELECT trong MySQL được sử dụng để chèn dữ liệu từ một bảng này sang một bảng khác bằng cách kết hợp câu lệnh INSERT INTO với SELECT. Nó giúp bạn sao chép dữ liệu từ một bảng nguồn vào một bảng đích mà không cần phải nhập thủ công từng giá trị. Điều này đặc biệt hữu ích khi bạn muốn di chuyển dữ liệu giữa các bảng, tạo bản sao của dữ liệu, hoặc sao chép dữ liệu dựa trên một điều kiện cụ thể.
2. Cú pháp của INSERT INTO SELECT trong MySQL
Cú pháp tổng quát:
INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
WHERE condition;target_table: Bảng đích nơi dữ liệu sẽ được chèn vào.source_table: Bảng nguồn mà từ đó dữ liệu được lấy ra.column1, column2, ...: Các cột tương ứng trong bảng nguồn và bảng đích.condition: Điều kiện (tùy chọn) để lọc dữ liệu từ bảng nguồn.
3. Bảng dữ liệu giả định
Giả sử chúng ta có hai bảng employees_2023 và employees_archive với dữ liệu như sau:
Bảng employees_2023 (bảng nguồn):
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 1 | John | Doe | Sales | 1500000 |
| 2 | Jane | Smith | Marketing | 1700000 |
| 3 | Bob | Johnson | Sales | 1300000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
Bảng employees_archive (bảng đích, ban đầu rỗng):
| employee_id | first_name | last_name | department | salary |
|---|
4. Cách sử dụng INSERT INTO SELECT trong MySQL
a. Sao chép toàn bộ dữ liệu từ bảng nguồn sang bảng đích
Nếu bạn muốn sao chép toàn bộ dữ liệu từ bảng employees_2023 sang bảng employees_archive, bạn có thể sử dụng câu lệnh sau:
Ví dụ 1: Chèn tất cả nhân viên từ employees_2023 vào employees_archive
INSERT INTO employees_archive (employee_id, first_name, last_name, department, salary)
SELECT employee_id, first_name, last_name, department, salary
FROM employees_2023;Kết quả:
Bảng employees_archive sẽ chứa tất cả các bản ghi từ bảng employees_2023.
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 1 | John | Doe | Sales | 1500000 |
| 2 | Jane | Smith | Marketing | 1700000 |
| 3 | Bob | Johnson | Sales | 1300000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
b. Chèn dữ liệu dựa trên điều kiện
Bạn có thể chèn dữ liệu từ bảng nguồn sang bảng đích chỉ khi dữ liệu thỏa mãn một điều kiện cụ thể.
Ví dụ 2: Chèn những nhân viên có mức lương lớn hơn 1,600,000 từ employees_2023 sang employees_archive
INSERT INTO employees_archive (employee_id, first_name, last_name, department, salary)
SELECT employee_id, first_name, last_name, department, salary
FROM employees_2023
WHERE salary > 1600000;Kết quả:
Chỉ những nhân viên có mức lương lớn hơn 1,600,000 được chèn vào bảng employees_archive.
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 2 | Jane | Smith | Marketing | 1700000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
c. Chèn dữ liệu vào các cột khác nhau
Bạn có thể chọn chèn dữ liệu từ các cột khác nhau của bảng nguồn vào các cột tương ứng trong bảng đích, không nhất thiết phải cùng thứ tự cột.
Ví dụ 3: Chèn các cột first_name và last_name vào bảng đích employees_archive
INSERT INTO employees_archive (first_name, last_name)
SELECT first_name, last_name
FROM employees_2023;Kết quả:
Bảng employees_archive sẽ chứa thông tin về tên nhân viên từ bảng employees_2023.
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| NULL | John | Doe | NULL | NULL |
| NULL | Jane | Smith | NULL | NULL |
| NULL | Bob | Johnson | NULL | NULL |
| NULL | Alice | Brown | NULL | NULL |
| NULL | Charlie | Green | NULL | NULL |
d. Chèn dữ liệu với phép tính
Bạn có thể thực hiện các phép tính trong truy vấn SELECT trước khi chèn vào bảng đích.
Ví dụ 4: Chèn dữ liệu với lương hàng năm vào employees_archive
INSERT INTO employees_archive (employee_id, first_name, last_name, department, salary)
SELECT employee_id, first_name, last_name, department, salary * 12 AS annual_salary
FROM employees_2023;Kết quả:
Bảng employees_archive sẽ chứa dữ liệu nhân viên với lương hàng năm.
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 1 | John | Doe | Sales | 18000000 |
| 2 | Jane | Smith | Marketing | 20400000 |
| 3 | Bob | Johnson | Sales | 15600000 |
| 4 | Alice | Brown | HR | 24000000 |
| 5 | Charlie | Green | Marketing | 21600000 |
5. Các ví dụ khác về INSERT INTO SELECT
Ví dụ 1: Chèn dữ liệu từ một bảng orders_2023 sang orders_archive dựa trên điều kiện
INSERT INTO orders_archive (order_id, customer_id, order_date)
SELECT order_id, customer_id, order_date
FROM orders_2023
WHERE order_date < '2024-01-01';Ví dụ 2: Chèn dữ liệu từ một bảng sales vào bảng yearly_sales và tính tổng doanh thu
INSERT INTO yearly_sales (product_id, total_sales)
SELECT product_id, SUM(sales_amount)
FROM sales
GROUP BY product_id;Ví dụ 3: Chèn dữ liệu với điều kiện và giới hạn số lượng bản ghi
INSERT INTO employees_archive (employee_id, first_name, last_name)
SELECT employee_id, first_name, last_name
FROM employees_2023
WHERE department = 'Sales'
LIMIT 2;6. Một số lưu ý khi sử dụng INSERT INTO SELECT trong MySQL
a. Bảng đích phải tồn tại
Bảng đích phải được tạo trước khi sử dụng INSERT INTO SELECT. Nếu bảng đích không tồn tại, bạn sẽ gặp lỗi. Để tạo bảng mới, bạn có thể sử dụng lệnh CREATE TABLE.
b. Số lượng và kiểu dữ liệu các cột phải khớp
Số lượng và kiểu dữ liệu của các cột trong câu lệnh INSERT INTO và SELECT phải khớp với nhau. Nếu không, bạn sẽ gặp lỗi khi chèn dữ liệu.
c. Không sao chép các ràng buộc
Khi sao chép dữ liệu, các ràng buộc như khóa chính, khóa ngoại sẽ không được tự động sao chép. Bạn phải đảm bảo rằng các ràng buộc cần thiết đã được thiết lập trong bảng đích.
d. Chèn dữ liệu vào một số cột cụ thể
Nếu bảng đích có nhiều cột hơn so với dữ liệu bạn muốn chèn, bạn cần chỉ định các cột cụ thể để tránh lỗi.
Kết luận
INSERT INTO SELECT là một công cụ mạnh mẽ giúp bạn dễ dàng chèn dữ liệu từ một bảng sang bảng khác một cách tự động và hiệu quả. Bạn có thể sử dụng nó để sao chép dữ liệu, di chuyển dữ liệu hoặc tạo các bản sao của dữ liệu dựa trên các điều kiện nhất định. Câu lệnh này giúp tiết kiệm thời gian và giảm thiểu lỗi khi làm việc với cơ sở dữ liệu lớn.
Hãy thử áp dụng các ví dụ này trong các bài tập và dự án thực tế trên CodeTutHub để hiểu rõ hơn về cách sử dụng INSERT INTO SELECT trong MySQL!








