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:

shell
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_2023employees_archive với dữ liệu như sau:

Bảng employees_2023 (bảng nguồn):

employee_idfirst_namelast_namedepartmentsalary
1JohnDoeSales1500000
2JaneSmithMarketing1700000
3BobJohnsonSales1300000
4AliceBrownHR2000000
5CharlieGreenMarketing1800000

Bảng employees_archive (bảng đích, ban đầu rỗng):

employee_idfirst_namelast_namedepartmentsalary

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

shell
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_idfirst_namelast_namedepartmentsalary
1JohnDoeSales1500000
2JaneSmithMarketing1700000
3BobJohnsonSales1300000
4AliceBrownHR2000000
5CharlieGreenMarketing1800000

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

shell
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_idfirst_namelast_namedepartmentsalary
2JaneSmithMarketing1700000
4AliceBrownHR2000000
5CharlieGreenMarketing1800000

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_namelast_name vào bảng đích employees_archive

shell
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_idfirst_namelast_namedepartmentsalary
NULLJohnDoeNULLNULL
NULLJaneSmithNULLNULL
NULLBobJohnsonNULLNULL
NULLAliceBrownNULLNULL
NULLCharlieGreenNULLNULL

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

shell
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_idfirst_namelast_namedepartmentsalary
1JohnDoeSales18000000
2JaneSmithMarketing20400000
3BobJohnsonSales15600000
4AliceBrownHR24000000
5CharlieGreenMarketing21600000

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

shell
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

shell
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

shell
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 INTOSELECT 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!