Điều kiện WHERE 1=0 trong MySQL (và hầu hết SQL) luôn là **FALSE**, do đó truy vấn sẽ **không trả về bất kỳ hàng nào** (empty set). Đây là kỹ thuật thường dùng để:
- Tạo bảng mới với cấu trúc y hệt nhưng không copy dữ liệu
- Kiểm tra cú pháp/cấu trúc cột mà không chạy dữ liệu
- Placeholder trong dynamic SQL
- Test performance kế hoạch thực thi (EXPLAIN) không đọc data
Cú pháp
SELECT * FROM ten_bang WHERE 1=0;
Ví dụ minh họa
1. Tạo bảng có dữ liệu
CREATE TABLE ConditionDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(10),
PRIMARY KEY(Id)
);
INSERT INTO ConditionDemo(Name) VALUES
('Larry'), ('Sam'), ('Mike'), ('Carol'), ('John'), ('Bob');
2. Xem dữ liệu (6 hàng)
SELECT * FROM ConditionDemo;
Kết quả: 6 hàng dữ liệu.
3. Truy vấn với WHERE 1=0
SELECT * FROM ConditionDemo WHERE 1=0;
Kết quả:
Empty set (0.00 sec)
Ứng dụng thực tế phổ biến
1. Tạo bảng mới copy cấu trúc (không copy data)
CREATE TABLE bang_moi AS SELECT * FROM bang_cu WHERE 1=0;
Tương đương CREATE TABLE bang_moi LIKE bang_cu nhưng cũng copy được cột tính toán (computed column), alias.
2. Kiểm tra metadata/cột không cần đọc data
EXPLAIN SELECT * FROM bang_lon WHERE 1=0;
-- Xem execution plan, index usage mà không scan data
3. Dynamic SQL building
-- Ứng dụng xây dựng WHERE động
SET @where_clause = 'WHERE 1=0';
IF (condition1) THEN SET @where_clause = CONCAT(@where_clause, ' OR cot1 = 1'); END IF;
IF (condition2) THEN SET @where_clause = CONCAT(@where_clause, ' OR cot2 = 2'); END IF;
PREPARE stmt FROM CONCAT('SELECT * FROM bang ', @where_clause);
EXECUTE stmt;
4. UNION với tập rỗng
SELECT 'Header' AS col1, 'Title' AS col2
UNION ALL
SELECT col1, col2 FROM bang WHERE 1=0
UNION ALL
SELECT col1, col2 FROM bang WHERE active = 1;
So sánh với các cách khác
| Cách | Kết quả | Ghi chú |
|---|---|---|
WHERE 1=0 | Empty set | Tiêu chuẩn, rõ ràng |
WHERE FALSE | Empty set | MySQL hỗ trợ, ít dùng |
WHERE 0=1 | Empty set | Tương tự |
LIMIT 0 | Empty set | |
WHERE id = -1 | Empty set (thường) | Phụ thuộc data, không an toàn |
Lưu ý
- Optimizer thông minh sẽ loại bỏ truy vấn này sớm (constant folding)
- Không gây table scan - hiệu năng cực nhanh
- Khác với
WHERE 1=1(luôn TRUE - dùng cho dynamic WHERE thêm điều kiện AND)