Vấn đề: Tìm các giá trị từ danh sách không có trong bảng
Cho một tập giá trị (6, 7, 8), cần tìm những giá trị không tồn tại trong cột khóa chính của bảng.
Giải pháp: UNION ALL + NOT EXISTS
Tạo tập giá trị ảo bằng UNION ALL, sau đó lọc bằng NOT EXISTS.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
Value INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
INSERT INTO DemoTable VALUES (), (), (), (), (); -- Tự động tạo 1,2,3,4,5
2. Dữ liệu hiện có
+-------+
| Value |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------+
3. Truy vấn tìm giá trị 6,7,8 không có trong bảng
SELECT tbl.Value
FROM (
SELECT 6 AS Value UNION ALL
SELECT 7 UNION ALL
SELECT 8
) tbl
WHERE NOT EXISTS (
SELECT 1 FROM DemoTable tbl1 WHERE tbl1.Value = tbl.Value
);
4. Kết quả
+-------+
| Value |
+-------+
| 6 |
| 7 |
| 8 |
+-------+
Giải thích
- Subquery
tbltạo bảng tạm chứa các giá trị cần kiểm tra (6,7,8). NOT EXISTSkiểm tra từng giá trị trongtblcó tồn tại trongDemoTablekhông.SELECT 1trong subquery tối ưu – không cần lấy dữ liệu thực, chỉ kiểm tra sự tồn tại.
Cách khác: LEFT JOIN
SELECT v.Value
FROM (
SELECT 6 AS Value UNION ALL SELECT 7 UNION ALL SELECT 8
) v
LEFT JOIN DemoTable d ON d.Value = v.Value
WHERE d.Value IS NULL;
Ứng dụng
- Kiểm tra tính toàn vẹn dữ liệu (missing IDs).
- Tạo danh sách giá trị cần INSERT mới (upsert logic).
- So sánh hai tập dữ liệu.