Giới thiệu
Dùng DELETE ... WHERE column NOT IN (value1, value2...) để xóa tất cả bản ghi **trừ** các giá trị liệt kê.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
FirstName VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES
('Chris'), ('Robert'), ('Mike'), ('Sam'), ('David');
Xem dữ liệu trước
mysql> SELECT * FROM DemoTable;
+-----------+ | FirstName | +-----------+ | Chris | | Robert | | Mike | | Sam | | David | +-----------+
Xóa trừ 'Robert' và 'Mike'
mysql> DELETE FROM DemoTable WHERE FirstName NOT IN ('Robert', 'Mike');
Query OK, 3 rows affected (0.17 sec)
Kết quả sau xóa
mysql> SELECT * FROM DemoTable;
+-----------+ | FirstName | +-----------+ | Robert | | Mike | +-----------+
⚠️ Cảnh báo quan trọng về NULL
Nếu cột có giá trị NULL, NOT IN sẽ **không khớp** và **không xóa** dòng đó (vì NULL NOT IN (...) = UNKNOWN).
-- Nếu có dòng FirstName = NULL
DELETE FROM DemoTable WHERE FirstName NOT IN ('Robert', 'Mike');
-- Dòng NULL sẽ KHÔNG bị xóa!
Giải pháp an toàn với NULL
DELETE FROM DemoTable
WHERE FirstName NOT IN ('Robert', 'Mike')
OR FirstName IS NULL; -- Xóa luôn NULL nếu muốn
-- Hoặc dùng NOT EXISTS (an toàn hơn với subquery phức tạp)
DELETE FROM DemoTable d
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT 'Robert' AS n UNION SELECT 'Mike') keep
WHERE keep.n = d.FirstName
);
Lưu ý
- Luôn backup hoặc test với SELECT trước khi DELETE.
NOT INvới subquery trả về NULL cũng có vấn đề tương tự. Ưu tiênNOT EXISTS.