Cột TINYINT thường dùng lưu boolean (0/1) hoặc trạng thái (0/1/NULL). Để lọc các hàng khác 1 (bao gồm 0 và NULL), dùng điều kiện cot <> 1 OR cot IS NULL.
Ví dụ minh họa
Tạo bảng nhân viên với cột isMarried TINYINT:
CREATE TABLE DemoTable (
EmployeeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(20),
isMarried TINYINT
);
INSERT INTO DemoTable (EmployeeName, isMarried) VALUES
('Chris', NULL), ('David', 1), ('Mike', 0), ('Sam', NULL), ('Bob', 0);
Lọc không kết hôn (0) hoặc chưa biết (NULL):
SELECT * FROM DemoTable WHERE isMarried <> 1 OR isMarried IS NULL;
Kết quả
| EmployeeId | EmployeeName | isMarried |
|---|---|---|
| 1 | Chris | NULL |
| 3 | Mike | 0 |
| 4 | Sam | NULL |
| 5 | Bob | 0 |
Giải thích logic
isMarried <> 1: Khớp 0 (FALSE trong boolean context).isMarried IS NULL: Khớp NULL (unknown).OR: Hợp nhất 2 điều kiện.- Lưu ý:
NULL <> 1trả vềNULL(không phải TRUE), nên phải tách raIS NULL.
Cách viết gọn hơn
WHERE NOT (isMarried = 1) -- Bao gồm cả 0 và NULL -- Hoặc WHERE isMarried <=> 0 -- Null-safe equal: khớp 0, KHÔNG khớp NULL WHERE isMarried IS NOT TRUE -- MySQL: TRUE=1, FALSE=0, UNKNOWN=NULL. IS NOT TRUE khớp 0 và NULL
Khuyên dùng: WHERE isMarried IS NOT TRUE — ngắn gọn, đúng ngữ nghĩa boolean.
Thiết kế tốt hơn
- Dùng
ENUM('single','married','divorced')thay vì TINYINT để rõ nghĩa. - Hoặc
BOOLEAN(alias của TINYINT(1)) với NOT NULL DEFAULT 0.