Câu lệnh DELETE trong MySQL được sử dụng để xóa dữ liệu từ một bảng. Dưới đây là hướng dẫn chi tiết từ các trường hợp cơ bản đến nâng cao, với các ví dụ cụ thể và minh họa rõ ràng.

1. Cấu trúc cơ bản của câu lệnh DELETE

Cú pháp cơ bản của câu lệnh DELETE là:

DELETE FROM table_name
WHERE condition;

Trong đó:

  • table_name: Tên bảng mà bạn muốn xóa dữ liệu từ đó.
  • condition: Điều kiện để xác định các dòng nào sẽ bị xóa.

Nếu không sử dụng WHERE, tất cả các dòng trong bảng sẽ bị xóa.

Ví dụ cơ bản:

Để xóa một bản ghi cụ thể trong bảng employees với employee_id = 1:

DELETE FROM employees
WHERE employee_id = 1;

Câu lệnh trên sẽ xóa dòng có employee_id = 1 khỏi bảng employees.

2. Xóa nhiều bản ghi dựa trên điều kiện

Bạn có thể xóa nhiều bản ghi cùng một lúc bằng cách sử dụng điều kiện WHERE.

Ví dụ:

Để xóa tất cả các bản ghi trong bảng employees với department_id = 2:

DELETE FROM employees
WHERE department_id = 2;

Câu lệnh trên sẽ xóa tất cả các dòng có department_id = 2 khỏi bảng employees.

3. Xóa tất cả các bản ghi trong bảng

Để xóa tất cả các bản ghi trong bảng mà không xóa cấu trúc bảng, không nên sử dụng câu lệnh DELETE mà nên dùng câu lệnh TRUNCATE. Tuy nhiên, nếu bạn muốn dùng DELETE:

Ví dụ:

DELETE FROM employees

Câu lệnh trên sẽ xóa tất cả các dòng trong bảng employees, nhưng cấu trúc bảng và các ràng buộc sẽ được giữ nguyên.

4. Xóa dựa trên kết quả của một truy vấn con

Bạn có thể xóa dữ liệu dựa trên kết quả của một truy vấn con.

Ví dụ:

Để xóa các bản ghi trong bảng employeesemployee_id không xuất hiện trong bảng salaries:

DELETE FROM employees
WHERE employee_id NOT IN (
    SELECT employee_id
    FROM salaries
);

Câu lệnh trên sẽ xóa các bản ghi trong employeesemployee_id không tồn tại trong bảng salaries.

5. Xóa với JOIN

Khi bạn cần xóa dữ liệu từ một bảng dựa trên điều kiện liên quan đến nhiều bảng, bạn có thể sử dụng JOIN.

Ví dụ:

Để xóa tất cả các bản ghi trong bảng employees mà phòng ban của họ đã bị xóa (dữ liệu trong bảng departments đã bị xóa):

DELETE e
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL;

Câu lệnh trên sẽ xóa các nhân viên thuộc phòng ban đã bị xóa khỏi bảng departments.

6. Xóa với điều kiện phức tạp

Bạn có thể sử dụng các điều kiện phức tạp trong phần WHERE của câu lệnh DELETE.

Ví dụ:

Để xóa các bản ghi trong bảng ordersorder_date nằm ngoài khoảng thời gian của tháng hiện tại và có status = 'canceled':

DELETE FROM orders
WHERE status = 'canceled'
AND (order_date < DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY)
     OR order_date > LAST_DAY(CURDATE()));

Câu lệnh trên sẽ xóa các đơn hàng bị hủy mà nằm ngoài khoảng thời gian của tháng hiện tại.

7. Xóa dựa trên số lượng dòng

Bạn có thể sử dụng LIMIT để xóa một số lượng cụ thể các bản ghi.

Ví dụ:

Để xóa 5 bản ghi đầu tiên có status = 'inactive' trong bảng users:

DELETE FROM users
WHERE status = 'inactive'
LIMIT 5;

Câu lệnh trên sẽ xóa 5 bản ghi đầu tiên trong bảng users mà có status = 'inactive'.

8. Xóa dữ liệu với ORDER BY

Sử dụng ORDER BY cùng với LIMIT để kiểm soát các bản ghi cụ thể cần xóa theo thứ tự.

Ví dụ:

Để xóa 10 bản ghi có created_at cũ nhất trong bảng logs:

DELETE FROM logs
ORDER BY created_at ASC
LIMIT 10;

Câu lệnh trên sẽ xóa 10 bản ghi đầu tiên dựa trên thứ tự ngày tạo (created_at).

9. Xóa với Trigger

Bạn có thể sử dụng Trigger để tự động xóa dữ liệu từ một bảng khác khi có thay đổi trên bảng hiện tại.

Ví dụ:

Tạo Trigger để tự động xóa bản ghi trong bảng archive khi bản ghi tương ứng trong bảng main bị xóa:

CREATE TRIGGER after_delete_main
AFTER DELETE ON main
FOR EACH ROW
BEGIN
    DELETE FROM archive
    WHERE archive_id = OLD.id;
END;

Trigger này sẽ xóa bản ghi trong bảng archive khi bản ghi tương ứng trong bảng main bị xóa.

10. Xóa dữ liệu với khóa chính tự động tăng (AUTO_INCREMENT)

Khi bạn xóa các bản ghi trong bảng có khóa chính tự động tăng, giá trị tự động tăng không bị thay đổi. Nếu bạn muốn đặt lại giá trị AUTO_INCREMENT về một giá trị cụ thể, bạn phải sử dụng ALTER TABLE.

Ví dụ:

Để đặt lại giá trị AUTO_INCREMENT cho bảng products:

ALTER TABLE products AUTO_INCREMENT = 1;

Sau khi thực hiện lệnh này, giá trị tiếp theo cho cột AUTO_INCREMENT sẽ bắt đầu từ 1.

11. Xóa dữ liệu trong cột kiểu JSON

Nếu bạn lưu trữ dữ liệu JSON trong bảng và cần xóa các phần tử cụ thể trong dữ liệu JSON, bạn có thể sử dụng các hàm JSON của MySQL.

Ví dụ:

Giả sử bạn có bảng settings với cột preferences kiểu JSON, và bạn muốn xóa một mục trong mảng JSON.

UPDATE settings
SET preferences = JSON_REMOVE(preferences, '$.notifications')
WHERE user_id = 1;

Câu lệnh trên sẽ xóa trường notifications khỏi đối tượng JSON trong cột preferences cho người dùng có user_id = 1.

12. Xóa dữ liệu dựa trên phân vùng (Partitioning)

Nếu bảng của bạn được phân vùng, bạn có thể xóa dữ liệu từ một phân vùng cụ thể.

Ví dụ:

Giả sử bạn có bảng sales được phân vùng theo tháng, và bạn muốn xóa dữ liệu từ phân vùng tháng 01 của năm 2024:

DELETE FROM sales
PARTITION (p202401);

Câu lệnh trên sẽ xóa dữ liệu từ phân vùng p202401 của bảng sales.

13. Xóa dữ liệu từ bảng với ràng buộc khóa ngoại

Khi xóa dữ liệu từ bảng có ràng buộc khóa ngoại (FOREIGN KEY), bạn cần đảm bảo rằng các bản ghi trong các bảng khác cũng được xử lý phù hợp.

Ví dụ:

Nếu bạn có bảng orders với customer_id là khóa ngoại tham chiếu đến bảng customers, và bạn muốn xóa khách hàng và các đơn hàng liên quan:

DELETE o
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 10;

Câu lệnh trên sẽ xóa tất cả các đơn hàng và khách hàng có customer_id = 10.

14. Xóa dữ liệu với IGNORE

Sử dụng từ khóa IGNORE để bỏ qua các lỗi khi thực hiện câu lệnh DELETE.

Ví dụ:

DELETE IGNORE FROM employees
WHERE employee_id = 999;

Câu lệnh trên sẽ xóa bản ghi với employee_id = 999, và nếu có lỗi xảy ra (ví dụ, không tìm thấy bản ghi), câu lệnh sẽ bỏ qua lỗi đó.

Trên đây là hướng dẫn chi tiết về câu lệnh DELETE trong MySQL với các trường hợp từ cơ bản đến nâng cao. Các ví dụ và kỹ thuật này giúp bạn hiểu rõ hơn cách xóa dữ liệu hiệu quả và an toàn trong MySQL.