Câu lệnh DELETE trong SQL được sử dụng để xóa dữ liệu không cần thiết từ cơ sở dữ liệu. Hiểu cách hoạt động và áp dụng lệnh DELETE giúp bạn quản lý dữ liệu hiệu quả, tránh rủi ro mất dữ liệu không mong muốn.
Đọc bài viết này để hiểu rõ hơn về:
- Tổng quan về câu lệnh DELETE trong SQL và cú pháp
- Ứng dụng của câu lệnh DELETE trong SQL
- Một số hạn chế của câu lệnh DELETE trong SQL
Câu lệnh DELETE trong SQL là gì?
Câu lệnh DELETE trong SQL là một công cụ quan trọng trong việc quản lý và làm sạch dữ liệu của SQL, cho phép loại bỏ các bản ghi không còn cần thiết dựa trên các điều kiện cụ thể mà không làm ảnh hưởng đến các thành phần khác của bảng (cấu trúc, chỉ mục, ràng buộc).
Tuy nhiên, việc sử dụng lệnh DELETE cần được thực hiện một cách cẩn thận vì khi dữ liệu đã bị xóa ta không thể hoàn tác (revoke) nếu lệnh không được thực hiện trong một giao dịch (transaction) hỗ trợ rollback.
Cú pháp tổng quát:
DELETE FROM table_name WHERE condition;
Trong đó:
- table_name: Tên bảng chứa các bản ghi cần xóa.
- condition: Điều kiện lọc các bản ghi cần xóa. Chỉ những bản ghi thỏa mãn điều kiện này mới bị xóa. Nếu không cung cấp điều kiện (bỏ WHERE), toàn bộ dữ liệu trong bảng sẽ bị xóa.
Các trường hợp sử dụng câu lệnh DELETE trong SQL
Giả sử ta có các bảng:
Bảng employees chứa thông tin của nhân viên như id, tên, phòng ban, lương và trạng thái như sau:
employee_id | name | department_id | salary | status |
1 | John Doe | 1 | 50000.00 | active |
2 | Jane Smith | 2 | 60000.00 | active |
3 | Alice Johnson | 3 | 55000.00 | inactive |
4 | Bob Brown | 1 | 48000.00 | active |
5 | Emma Davis | 3 | 62000.00 | terminated |
6 | Mike Wilson | 3 | 51000.00 | inactive |
Bảng departments chứa thông tin về các phòng ban gồm id và tên phòng:
department_id | department_name |
1 | HR |
2 | Finance |
3 | IT |
Bạn có thể thực hành tạo bảng trên trên SQL Server với cú pháp sau:
-- tạo bảng employees CREATE TABLE employees ( employee_id INT PRIMARY KEY, name NVARCHAR(50), department NVARCHAR(50), salary DECIMAL(10, 2), status NVARCHAR(20) ); -- thêm dữ liệu vào bảng employees INSERT INTO employees (employee_id, name, department, salary, status) VALUES (1, 'John Doe', 'HR', 50000.00, 'active'), (2, 'Jane Smith', 'Finance', 60000.00, 'active'), (3, 'Alice Johnson', 'IT', 55000.00, 'inactive'), (4, 'Bob Brown', 'HR', 48000.00, 'active'), (5, 'Emma Davis', 'IT', 62000.00, 'terminated'); -- tạo bảng departments CREATE TABLE departments ( department_id INT PRIMARY KEY, department_name NVARCHAR(50) ); -- thêm dữ liệu vào bảng departments INSERT INTO departments (department_id, department_name) VALUES (1, 'HR'), (2, 'Finance'), (3, 'IT');
Xóa một bản ghi cụ thể
Ta có thể xóa một bản ghi cụ thể bằng cách kết hợp với điều kiện WHERE. Ví dụ để xoá bản ghi của nhân viên có employee_id = 5 ta sử dụng cú pháp sau:
DELETE FROM employees WHERE employee_id = 5;
Giải thích: Lệnh trên tìm và xóa bản ghi có employee_id = 5. Dữ liệu của Emma Davis sẽ bị loại bỏ.
Xóa nhiều bản ghi dựa trên điều kiện
Ví dụ để xóa tất cả nhân viên có trạng thái là inactive ta sử dụng cú pháp:
DELETE FROM employees WHERE status = 'inactive';
Bảng employees sẽ trở thành:
employee_id | name | department_id | salary | status |
1 | John Doe | 1 | 50000.00 | active |
2 | Jane Smith | 2 | 60000.00 | active |
4 | Bob Brown | 1 | 48000.00 | active |
Giải thích: Bản ghi của Alice Johnson và Mike Wilson sẽ bị xóa vì có trạng thái là “inactive”.
Xóa dựa trên nhiều điều kiện
Ngoài ra, ta có thể kết hợp nhiều điều kiện trong WHERE để chỉ xóa các bản ghi thỏa mãn đồng thời nhiều điều kiện. Ví dụ, xóa tất cả nhân viên thuộc phòng ban “IT” và có trạng thái “terminated” với cú pháp như sau:
DELETE FROM employees WHERE department_id = 3 AND status = 'terminated';
Bảng employees sẽ trở thành:
employee_id | name | department_id | salary | status |
1 | John Doe | 1 | 50000.00 | active |
2 | Jane Smith | 2 | 60000.00 | active |
3 | Alice Johnson | 3 | 55000.00 | inactive |
4 | Bob Brown | 1 | 48000.00 | active |
6 | Mike Wilson | 3 | 51000.00 | inactive |
Giải thích: Bản ghi của Emma Davis bị xóa vì thuộc phòng ban IT và có trạng thái “terminated”.
Xóa toàn bộ dữ liệu trong bảng
Ví dụ để xóa toàn bộ dữ liệu trong bảng employees, nhưng giữ nguyên cấu trúc bảng ta sử dụng cú pháp:
DELETE FROM employees;
Giải thích: Khi không sử dụng điều kiện WHERE, cú pháp trên sẽ xóa tất cả dữ liệu trong bảng nhưng không ảnh hưởng đến cấu trúc bảng.
Xóa dữ liệu liên quan giữa các bảng
Giả sử ta muốn xóa tất cả nhân viên thuộc phòng ban “HR”. Vì department_id là khóa ngoại liên kết giữa hai bảng, ta sử dụng JOIN để xác định các nhân viên cần xóa trước khi thực hiện lệnh DELETE với cú pháp sau:
DELETE e FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name = 'HR';
Bảng employees sẽ trở thành:
employee_id | name | department_id | salary | status |
2 | Jane Smith | 2 | 60000.00 | active |
3 | Alice Johnson | 3 | 55000.00 | inactive |
5 | Emma Davis | 3 | 62000.00 | terminated |
6 | Mike Wilson | 3 | 51000.00 | inactive |
Giải thích: Tất cả nhân viên thuộc phòng ban HR (John Doe và Bob Brown) sẽ bị xóa.
Một số hạn chế của câu lệnh DELETE trong SQL
Hiệu suất thấp khi xóa số lượng lớn dữ liệu
Lệnh DELETE xử lý từng bản ghi một và ghi lại các thay đổi trong nhật ký giao dịch (transaction log), khiến nó chậm hơn so với các lệnh như TRUNCATE khi cần xóa toàn bộ bảng hoặc một lượng lớn dữ liệu.
Không thể hoàn tác nếu không sử dụng giao dịch
Sau khi lệnh DELETE được thực thi và cam kết (commit), dữ liệu bị xóa sẽ không thể khôi phục, trừ khi bạn có bản sao lưu. Vì vậy phải cẩn thận khi sử dụng, đặc biệt khi xóa dữ liệu nhạy cảm.
Không giải phóng không gian bộ nhớ ngay lập tức
Lệnh DELETE không giải phóng không gian bộ nhớ vật lý trong cơ sở dữ liệu, vì vậy bảng có thể vẫn chiếm dung lượng lớn ngay cả khi dữ liệu đã bị xóa.
Phụ thuộc vào ràng buộc khóa ngoại
Nếu bảng có các ràng buộc khóa ngoại, việc xóa dữ liệu liên quan có thể gây lỗi hoặc yêu cầu xóa dữ liệu trong các bảng khác trước, khiến thao tác DELETE trở nên phức tạp hơn.
Ngoài ra, còn có thể sử dụng tùy chọn ON DELETE CASCADE khi khai báo khóa ngoại để tự động xóa các bản ghi liên quan. Khi một bản ghi trong bảng cha bị xóa, tất cả các bản ghi trong bảng con tham chiếu đến nó cũng sẽ bị xóa theo, giúp tránh lỗi ràng buộc dữ liệu và giảm bớt công việc xóa thủ công.
Không phù hợp cho các tác vụ xóa toàn bộ dữ liệu thường xuyên
Trong các trường hợp cần làm sạch bảng thường xuyên (ví dụ như bảng tạm), lệnh DELETE không phải là lựa chọn tối ưu. TRUNCATE sẽ phù hợp hơn do hiệu suất cao hơn và giải phóng bộ nhớ nhanh chóng.
Câu hỏi thường gặp về câu lệnh DELETE trong SQL
Có thể xóa tất cả dữ liệu trong bảng mà không xóa cấu trúc bảng không?
Có, bạn có thể xóa tất cả dữ liệu trong bảng mà vẫn giữ nguyên cấu trúc bảng bằng cách sử dụng:
- DELETE: Sử dụng cú pháp DELETE FROM table_name; để xóa toàn bộ dữ liệu. Phương pháp này ghi từng thao tác xóa vào nhật ký giao dịch.
- TRUNCATE: Sử dụng cú pháp TRUNCATE TABLE table_name; để xóa nhanh toàn bộ dữ liệu mà không ghi từng thao tác vào nhật ký giao dịch. Tuy nhiên, TRUNCATE không cho phép sử dụng điều kiện và không thể dùng trên bảng có khóa ngoại ràng buộc.
Có thể xóa dữ liệu từ nhiều bảng cùng lúc không?
Không, lệnh DELETE chỉ hoạt động trên một bảng tại một thời điểm. Để xóa dữ liệu từ nhiều bảng, cần sử dụng nhiều câu lệnh DELETE riêng biệt hoặc viết các truy vấn phức tạp với các bảng liên kết.
Có thể khôi phục dữ liệu sau khi dùng DELETE không?
Không thể khôi phục dữ liệu sau khi dùng DELETE nếu lệnh đã được cam kết (commit). Để khôi phục, bạn cần có bản sao lưu hoặc sử dụng giao dịch (transaction) và thực hiện ROLLBACK trước khi thực thi.
Tổng kết câu lệnh DELETE trong SQL
Câu lệnh DELETE trong SQL là công cụ mạnh mẽ và linh hoạt để xóa dữ liệu trong SQL, nhưng cũng đòi hỏi sự cẩn thận và hiểu biết rõ ràng để sử dụng đúng cách. Việc nắm vững cú pháp, các trường hợp áp dụng và hạn chế của DELETE sẽ giúp bạn tối ưu hóa quy trình quản lý dữ liệu. ITviec hy vọng bài viết trên đã giúp bạn có cái nhìn tổng quan về lệnh DELETE và cách sử dụng sao cho hiệu quả.
Tham khảo các bài viết khác về các lệnh và thao tác quan trọng trong SQL:
- Câu lệnh SQL: Tổng hợp các câu lệnh, toán tử và ràng buộc SQL
- Tổng hợp 90+ function trong SQL cần biết
- SELECT trong SQL: Hướng dẫn các cách ứng dụng lệnh SELECT
- Câu lệnh INSERT trong SQL: Cú pháp và cách hoạt động
- Câu lệnh Update trong SQL: Các thành phần và cách hoạt động
- Trigger trong SQL: Chi tiết các thao tác trigger SQL cơ bản