Sử dụng IFNULL() kết hợp với hàm DEFAULT() để phân biệt giữa NULL do người dùng nhập và NULL do mặc định.
Tạo bảng với DEFAULT
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(100) DEFAULT 'Larry',
-> Age INT DEFAULT NULL
-> );
Chèn dữ liệu
mysql> INSERT INTO DemoTable(Name, Age) VALUES('John', 23); -- Cung cấp cả 2
mysql> INSERT INTO DemoTable VALUES(); -- Mặc định cả 2
mysql> INSERT INTO DemoTable(Name) VALUES('David'); -- Chỉ Name, Age = DEFAULT NULL
mysql> INSERT INTO DemoTable(Age) VALUES(24); -- Chỉ Age, Name = DEFAULT 'Larry'
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | John | 23 | | 2 | Larry | NULL | | 3 | David | NULL | | 4 | Larry | 24 | +----+-------+------+
Tìm hàng nơi Name KHÁC giá trị mặc định ('Larry')
mysql> SELECT * FROM DemoTable
-> WHERE IFNULL(Name, DEFAULT(Name)) <> DEFAULT(Name);
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | John | 23 | | 3 | David | NULL | +----+-------+------+
Giải thích logic
DEFAULT(Name)trả về giá trị mặc định của cột Name ('Larry')IFNULL(Name, DEFAULT(Name)): Nếu Name là NULL thì dùng DEFAULT(Name), ngược lại giữ Name- So sánh
<> DEFAULT(Name)loại bỏ các hàng có Name = 'Larry' (kể cả do mặc định hoặc nhập tay)
Phân biệt NULL nhập tay vs DEFAULT NULL
MySQL không phân biệt được giữa INSERT INTO t VALUES() (mặc định) và INSERT INTO t(Name) VALUES(NULL) (nhập NULL rõ ràng) — cả hai đều lưu NULL. Cách trên chỉ kiểm tra giá trị khác DEFAULT, không phân biệt nguồn gốc NULL.
Cách khác: Kiểm tra cột có DEFAULT không
SELECT COLUMN_NAME, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'DemoTable' AND COLUMN_DEFAULT IS NOT NULL;