1. Giới thiệu
SELECT INTO là một câu lệnh trong MySQL được sử dụng để sao chép dữ liệu từ một bảng hoặc truy vấn vào một bảng mới. Nó giúp tạo ra một bản sao của dữ liệu mà không cần tạo trước bảng mới. Tuy nhiên, trong MySQL, câu lệnh SELECT INTO không được hỗ trợ trực tiếp để sao chép dữ liệu vào bảng mới. Thay vào đó, MySQL sử dụng câu lệnh CREATE TABLE ... AS SELECT để thực hiện chức năng tương tự.
Cụ thể, trong MySQL, bạn có thể sử dụng CREATE TABLE ... AS SELECT để tạo một bảng mới từ kết quả của một truy vấn. Bài viết này sẽ giúp bạn hiểu cách sử dụng câu lệnh tương tự SELECT INTO trong MySQL và cung cấp các ví dụ thực tế.
2. Sự khác biệt giữa SQL Server và MySQL
- Trong SQL Server, bạn có thể sử dụng câu lệnh
SELECT INTOđể tạo một bảng mới và chèn dữ liệu từ một truy vấn.
SELECT column1, column2, ... INTO new_table FROM existing_table WHERE condition;- Trong MySQL, bạn cần sử dụng
CREATE TABLE ... AS SELECTthay vìSELECT INTOđể tạo một bảng mới với dữ liệu từ bảng khác.
CREATE TABLE new_table AS SELECT column1, column2, ... FROM existing_table WHERE condition;3. Cú pháp của SQL CREATE TABLE ... AS SELECT trong MySQL
CREATE TABLE new_table AS
SELECT column1, column2, ...
FROM existing_table
WHERE condition;new_table: Là bảng mới sẽ được tạo ra từ kết quả của truy vấnSELECT.column1, column2, ...: Các cột bạn muốn sao chép từ bảng hiện tại.existing_table: Bảng hiện tại chứa dữ liệu mà bạn muốn sao chép.condition: Điều kiện lọc dữ liệu (tùy chọn).
4. Bảng dữ liệu giả định
Giả sử chúng ta có bảng employees với các thông tin sau:
| 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 |
5. Cách sử dụng CREATE TABLE ... AS SELECT trong MySQL
a. Sao chép toàn bộ bảng
Bạn có thể sao chép toàn bộ bảng vào một bảng mới mà không cần chỉ định bất kỳ điều kiện nào.
Ví dụ 1: Tạo một bảng mới employees_copy với tất cả dữ liệu từ bảng employees
CREATE TABLE employees_copy AS
SELECT *
FROM employees;Kết quả: Bảng employees_copy sẽ được tạo và chứa toàn bộ dữ liệu từ bảng employees.
| 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. Sao chép các cột cụ thể từ một bảng
Bạn có thể chỉ sao chép các cột cụ thể từ bảng hiện có vào bảng mới.
Ví dụ 2: Tạo bảng employee_names chỉ chứa các cột first_name và last_name từ bảng employees
CREATE TABLE employee_names AS
SELECT first_name, last_name
FROM employees;Kết quả: Bảng employee_names sẽ chứa chỉ hai cột first_name và last_name.
| first_name | last_name |
|---|---|
| John | Doe |
| Jane | Smith |
| Bob | Johnson |
| Alice | Brown |
| Charlie | Green |
c. Sao chép dữ liệu dựa trên điều kiện
Bạn cũng có thể sử dụng điều kiện WHERE để chỉ sao chép những hàng dữ liệu thỏa mãn điều kiện.
Ví dụ 3: Tạo bảng high_salary_employees chứa nhân viên có lương lớn hơn 1,500,000
CREATE TABLE high_salary_employees AS
SELECT *
FROM employees
WHERE salary > 1500000;Kết quả: Bảng high_salary_employees sẽ chỉ chứa các nhân viên có lương lớn hơn 1,500,000.
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 2 | Jane | Smith | Marketing | 1700000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
d. Sao chép dữ liệu với các phép tính
Bạn có thể thực hiện các phép tính trong câu lệnh SELECT và lưu kết quả vào bảng mới.
Ví dụ 4: Tạo bảng annual_salaries chứa thông tin nhân viên và lương hàng năm (salary * 12)
CREATE TABLE annual_salaries AS
SELECT first_name, last_name, salary * 12 AS annual_salary
FROM employees;Kết quả: Bảng annual_salaries sẽ chứa thông tin nhân viên và lương hàng năm.
| first_name | last_name | annual_salary |
|---|---|---|
| John | Doe | 18000000 |
| Jane | Smith | 20400000 |
| Bob | Johnson | 15600000 |
| Alice | Brown | 24000000 |
| Charlie | Green | 21600000 |
6. Các ví dụ khác về SELECT INTO trong MySQL
Ví dụ 1: Sao chép dữ liệu nhân viên trong phòng ban "Marketing"
CREATE TABLE marketing_employees AS
SELECT *
FROM employees
WHERE department = 'Marketing';Ví dụ 2: Sao chép dữ liệu và tính lương trung bình của nhân viên theo phòng ban
CREATE TABLE avg_department_salaries AS
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;Ví dụ 3: Sao chép dữ liệu với điều kiện và giới hạn số lượng bản ghi
CREATE TABLE top_3_highest_salary_employees AS
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 3;7. Một số lưu ý khi sử dụng SELECT INTO hoặc CREATE TABLE ... AS SELECT
a. Kiểu dữ liệu của bảng mới
Bảng mới sẽ có các cột với kiểu dữ liệu dựa trên các cột trong bảng gốc. Nếu cần thay đổi kiểu dữ liệu của các cột, bạn phải sử dụng lệnh CREATE TABLE để định nghĩa bảng mới trước, sau đó sử dụng INSERT INTO ... SELECT để sao chép dữ liệu.
b. Không sao chép các ràng buộc
Khi sử dụng CREATE TABLE ... AS SELECT, các ràng buộc (constraints) như khóa chính (PRIMARY KEY), khóa ngoại (FOREIGN KEY), hoặc chỉ mục (INDEX) sẽ không được sao chép sang bảng mới. Nếu cần các ràng buộc, bạn phải thêm thủ công sau khi tạo bảng.
c. Không sao chép dữ liệu tự động tăng (AUTO_INCREMENT)
Bất kỳ cột nào có thuộc tính AUTO_INCREMENT trong bảng gốc cũng sẽ không được sao chép tự động. Bạn cần thiết lập lại tính năng AUTO_INCREMENT cho cột đó trong bảng mới.
Kết luận
SELECT INTO (hoặc trong MySQL là CREATE TABLE ... AS SELECT) là một công cụ mạnh mẽ để sao chép dữ liệu từ một bảng hoặc truy vấn vào một bảng mới. Bạn có thể sử dụng nó để sao chép toàn bộ bảng, sao chép các cột cụ thể, sao chép dữ liệu với điều kiện, và thậm chí thực hiện các phép tính trong quá trình sao chép. Điều này giúp dễ dàng tạo ra các bản sao dữ liệu hoặc phân tích dữ liệu trên các bảng mới mà không ảnh hưởng đến bảng gốc.
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 sâu hơn về cách sử dụng SELECT INTO trong MySQL!








