Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Ý nghĩa của WHERE 1=0 trong MySQL (trả về tập rỗng)

Đ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áchKết quảGhi chú
WHERE 1=0Empty setTiêu chuẩn, rõ ràng
WHERE FALSEEmpty setMySQL hỗ trợ, ít dùng
WHERE 0=1Empty setTương tự
LIMIT 0Empty set
WHERE id = -1Empty 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)