Lệnh DELETE trong SQL Server

Lệnh DELETE trong SQL Server (Transact-SQL) được dùng để xóa một hoặc nhiều bản ghi (hàng) từ một bảng trong SQL Server.

Bạn có thể xóa những bản ghi thỏa mãn điều kiện nhất định hoặc xóa toàn bộ bản ghi trong bảng một cách dễ dàng với DELETE. Bài viết này sẽ bao gồm cú pháp cơ bản của lệnh DELETE trong SQL Server và những ví dụ minh họa dễ hiểu để bạn nắm được cách sử dụng của lệnh SQL phổ biến này.

Ta sẽ sử dụng bảng có tên Quantrimang.com với dữ liệu như dưới đây để thực hiện các ví dụ trong bài viết.


 +------------+----------+-------------+-------+
 | IDChuyenmuc|  Muccon  |Chuyenmuclon | Sobai |
 +------------+----------+-------------+-------+
 |   1        |SQL Server|Lap trinh    | 101   |
 |   2        |Facebook  |Mang xa hoi  | 152   |
 |   3        |Python    |Lap trinh    | 101   |
 |   4        |JavaScript|Lap trinh    | 122   |
 |   5        |Chrome    |Web          |  94   |
 |   6        |Instagram |Mang xa hoi  | 165   |
 +------------+----------+-------------+-------+

Cách sử dụng DELETE trong SQL Server

  • Cú pháp lệnh DELETE trong SQL Server
  • Ví dụ xóa hàng thỏa mãn 1 điều kiện
  • Ví dụ xóa hàng thỏa mãn 2 điều kiện
  • Ví dụ xóa hàng dùng từ khóa TOP
  • Ví dụ xóa hàng dùng mệnh đề EXISTS

1. Cú pháp lệnh DELETE trong SQL Server

Cú pháp đơn giản của lệnh DELETE như sau:

DELETE FROM bang
  [WHERE dieu_kien];

Cú pháp đầy đủ của lệnh DELETE như dưới đây:

DELETE [ TOP (giatri_dau) [PERCENT] ]
   FROM bang
   [WHERE dieu_kien];

Tên biến hoặc giá trị biến:

bang: Bảng cần xóa bản ghi.

WHERE dieu_kien: Tùy chọn. Điều kiện mà bản ghi phải đáp ứng để bị xóa.

TOP (giatri_dau): Tùy chọn. Nếu được nêu ra cụ thể sẽ chèn giá trị đầu của hàng dựa trên giatri_dau. Ví dụ TOP(10) sẽ chèn 10 hàng đầu tiên từ bộ kết quả.

PERCENT: Tùy chọn. Nếu được nêu ra cụ thể thì các hàng đầu tiên dựa trên số phần trăm giatri_dau của bộ kết quả. Ví dụ như TOP(10) PERCENT sẽ chèn 10% giá trị đầu trong bộ kết quả.

Lưu ý: 

* Hãy cẩn thận khi xóa các bản ghi trong bảng! Lưu ý mệnh đề WHERE trong câu lệnh DELETE. Mệnh đề WHERE chỉ định (các) bản ghi nào nên được xóa. Nếu bạn bỏ qua mệnh đề WHERE, tất cả các bản ghi trong bảng sẽ bị xóa!

* Không cần liệt kê các trường trong lệnh DELETE vì bạn sẽ xóa toàn bộ hàng trong bảng.

2. Ví dụ xóa hàng thỏa mãn 1 điều kiện

DELETE  FROM [Quantrimang.com]
   WHERE Muccon='Instagram';

Lệnh này sẽ xóa tất cả bản ghi trong bảng Quantrimang.com có Muccon là Instagram.

Nếu muốn kiểm tra số hàng bị xóa, chạy lệnh SELECT trước khi thực hiện lệnh xóa.

SELECT count (*)
   FROM [Quantrimang.com]
   WHERE Muccon = 'Instagram';

Sau khi chạy lệnh xóa, bảng chỉ còn như sau:


 +------------+----------+-------------+-------+
 | IDChuyenmuc|  Muccon  |Chuyenmuclon | Sobai |
 +------------+----------+-------------+-------+
 |   1        |SQL Server|Lap trinh    | 101   |
 |   2        |Facebook  |Mang xa hoi  | 152   |
 |   3        |Python    |Lap trinh    | 101   |
 |   4        |JavaScript|Lap trinh    | 122   |
 |   5        |Chrome    |Web          |  94   |
 +------------+----------+-------------+-------+

3. Ví dụ xóa hàng thỏa mãn 2 điều kiện

Giả sử ta sẽ xóa những hàng có Chuyenmuclon là Lap trinh, với Sobai lớn hơn 101. Để biết số hàng bị xóa, chạy lệnh SELECT dưới đây trước khi chạy lệnh DELETE. Kết quả sẽ trả về 1.

SELECT count (*)
   FROM [Quantrimang.com]
   WHERE Chuyenmuclon = 'Lap trinh'
   AND Sobai > 101;

Để xóa những bản ghi thỏa mãn điều kiện đã đưa ra bên trên, ta sẽ chạy lệnh sau:

DELETE FROM [Quantrimang.com]
   WHERE Chuyenmuclon = 'Lap trinh'
   AND Sobai > 101;

Lệnh trên đã xóa tất cả bản ghi trong bảng Quantrimang.com có Chuyenmuclon là Lap trinh và Sobai lớn hơn 101. Kết quả sau khi xóa ta sẽ còn bảng sau:


 +------------+----------+-------------+-------+
 | IDChuyenmuc|  Muccon  |Chuyenmuclon | Sobai |
 +------------+----------+-------------+-------+
 |   1        |SQL Server|Lap trinh    | 101   |
 |   2        |Facebook  |Mang xa hoi  | 152   |
 |   3        |Python    |Lap trinh    | 101   |
 |   5        |Chrome    |Web          |  94   |
 +------------+----------+-------------+-------+

4. Ví dụ xóa hàng dùng từ khóa TOP

Vì bảng đã bị xóa khá nhiều dòng rồi, mình sẽ thêm lại dữ liệu bằng lệnh INSERT để bảng trở về như bảng ban đầu rồi thực hiện tiếp lệnh xóa nhé.

Với từ khóa TOP(x), x là số bản ghi cần xóa, ta sẽ chỉ xóa x bản ghi đầu tiên trong số những bản ghi thỏa mãn điều kiện.

Giả sử, ta cần xóa 2 hàng đầu tiên trong số các hàng có Chuyenmuclon là Lap trinh, khi đó ta dùng lệnh sau:

DELETE TOP(2)
   FROM [Quantrimang.com]
   WHERE Chuyenmuclon = 'Lap trinh';

Bảng có tất cả 3 bản ghi có Chuyenmuclon là Laptrinh, nhưng lệnh trên chỉ xóa 2 bản ghi đầu tiên thỏa mãn điều kiện, hàng thứ 3 sẽ không bị ảnh hưởng bởi lệnh DELETE này. Đây là bảng kết quả sau khi chạy lệnh:

 +------------+----------+-------------+-------+ | IDChuyenmuc| Muccon |Chuyenmuclon | Sobai | +------------+----------+-------------+-------+ | 2 |Facebook |Mang xa hoi | 152 | | 4 |JavaScript|Lap trinh | 122 | | 5 |Chrome |Web          |  94   |
 |   6        |Instagram |Mang xa hoi  | 165   |
 +------------+----------+-------------+-------+

5. Ví dụ xóa hàng dùng mệnh đề EXISTS

Giả sử ta có thêm một bảng Muc nữa như sau:


 +----+-----------+-----------+
 | ID |  Tenmuc   | Trangthai |
 +----+-----------+-----------+
 | 1  |Lap trinh  |  Hien     |
 | 2  |Mang xa hoi|  An       |
 | 3  |Web        |  An       |
 +----+-----------+-----------+

Bạn có thể thực hiện lệnh xóa phức tạp hơn, như xóa bản ghi trong 1 bảng dựa trên giá trị trong 1 bảng khác chẳng hạn. Vì không thể đưa ra nhiều hơn 1 bảng trong mệnh đề FROM trong lệnh DELETE nên có thể dùng mệnh đề EXISTS như dưới đây.

DELETE FROM [Quantrimang.com]
 WHERE EXISTS
   (SELECT *
   FROM Muc
   WHERE Muc.ID = [Quantrimang.com].IDChuyenmuc
   AND Muc.ID < 3);

Lưu ý: Lệnh chạy trên bảng kết quả sau khi thực hiện lệnh xóa ở mục 4, không phải bảng ban đầu.


 +------------+----------+-------------+-------+
 | IDChuyenmuc|  Muccon  |Chuyenmuclon | Sobai |
 +------------+----------+-------------+-------+
 |   4        |JavaScript|Lap trinh    | 122   |
 |   5        |Chrome    |Web          |  94   |
 |   6        |Instagram |Mang xa hoi  | 165   |
 +------------+----------+-------------+-------+

Lệnh DELETE này sẽ xóa tất cả bản ghi trong bảng Quantrimang.com khi có bản ghi trong bảng Muc mà ID nhỏ hơn 3 và ID khớp với IDChuyenmuc.

Nếu muốn xác định số dòng bị xóa, chạy lệnh SELECT trước khi xóa.

SELECT count (*)
 FROM [Quantrimang.com]
 WHERE EXISTS
   (SELECT *
   FROM Muc
   WHERE Muc.ID = [Quantrimang.com].IDChuyenmuc
   AND Muc.ID < 3);