MySQL NULL - The Beginner’s Guide

  MySQL    —  2019, Aug 19    

Bài viết này sẽ hướng dẫn bạn sử dụng giá trị NULL và 1 số các hàm hữu ích để làm việc với giá trị NULL một cách hiệu quả.

Giới thiệu về giá trị NULL trong MySQL

NULL trong MySQL được hiểu là không biết (unknown). Một giá trị NULL khác với zero và chuỗi rỗng ''

Giá trị NULL sẽ không bằng chính nó, nếu so sánh giá trị NULL với giá trị NULL khác hoặc bất kỳ giá trị khác thì kết quả sẽ là NULL bởi vì giá trị của mỗi giá trị NULL là unknown.

Thông thường, giá trị NULL chỉ ra dữ liệu thiếu, unknown hoặc không thích hợp. Ví dụ, số điện thoại có thể là NULL và được thêm vào sau.

Khi tạo một bảng, cần chỉ ra cột nào có thể là giá tị NULL hoặc không bằng cách sử dụng NOT NULL

Ví dụ, lệnh sau tạo ra bảng leads:

CREATE TABLE leads (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    source VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    phone VARCHAR(25)
);

id là cột primary key do đó không được phép NULL

Cột first_name, last_name, và sourceNOT NULL, do đó không được phép insert giá trị NULL vào các cột này. Còn cộtemailphone có thể là NULL.

Bạn có thể sử dụng giá trị NULL trong lệnh INSERT để chỉ ra là dữ liệu thiếu. Ví dụ lệnh sau thiếu dữ liệu của cột phone

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('John','Doe','Web Search','[email protected]',NULL);

Vì giá trị mặc định của cột email là NULL do đó bạn có thể bỏ qua email trong lệnh INSERT:

INSERT INTO leads(first_name,last_name,source,phone)
VALUES('Lily','Bush','Cold Calling','(408)-555-1234'),
('David','William','Web Search','(408)-888-6789');

MySQL NULL Insert

SET NULL trong lệnh UPDATE

Sử dụng toán tử gán (=) để gán giá trị NULL:

UPDATE leads 
SET 
    phone = NULL
WHERE
    id = 3;

ORDER BY với NULL

Trong MySQL thì NULL được hiểu là có thứ tự thấp nhất, nên khi sort theo thứ tự tăng dần thì các giá trị NULL sẽ được hiển thị đầu tiên:

SELECT 
    *
FROM
    leads
ORDER BY phone;

MySQL NULL ORDER BY

Ngược lại nếu sử dụng ORDER BY DESC thì các giá trị NULL sẽ xuất hiện ở cuối kết quả trả về:

SELECT 
    *
FROM
    leads
ORDER BY phone DESC;

MySQL NULL ORDER BY DESC

Để kiểm tra giá trị NULL thì bạn sử dụng IS NULL hoặc IS NOT NULL trong mệnh đề WHERE:

SELECT 
    *
FROM
    leads
WHERE
    phone IS NULL;

MySQL IS NULL

Lấy tất cả bản ghi có email khác NULL

SELECT 
    *
FROM
    leads
WHERE
    email IS NOT NULL;

MySQL IS NOT NULL

Mặc dù NULL không bằng NULL nhưng trong mệnh đề GROUP BY thì hai giá trị NULL là bằng nhau.

SELECT 
    id, first_name, last_name, email, phone
FROM
    leads
GROUP BY email;

MySQL NULL with GROUP BY

Truy vấn chỉ trả về 2 bản ghi bởi vì toàn bộ các bản ghi có email là NULL sẽ được gộp làm 1.

NULL và UNIQUE index

Khi bạn sử dụng một unique constraint hoặc một UNIQUE index trong một cột thì bạn có thể thêm nhiều giá trị NULL vào cột đó. Điều này hoàn toàn bình thường vì trong trường hợp này MySQL xem xét giá trị NULL là riêng biệt.

Để kiểm chứng thì trước tiên tạo 1 UNIQUE index cho cột phone.

CREATE UNIQUE INDEX idx_phone ON leads(phone);

Chú ý rằng nếu bạn sử dụng BDB storage engine thì MYSQL xem giá trị NULL là bằng nhau do đó bạn sẽ không thể thêm nhiều giá trị NULL vào 1 cột có unique constraint.

MySQL NULL functions

Một số các hàm làm việc với NULL như: IFNULL, COALESCE, và NULLIF.

Hàm IFNULL có 2 tham số đầu vào, nếu tham số thứ nhất not NULL thì sẽ trả về, ngược lại sẽ trả về giá trị tham số thứ 2.

Ví dụ sau trả về giá trị 'N/A' nếu giá trị cột phone là NULL.

SELECT 
    id, first_name, last_name, IFNULL(phone, 'N/A') phone
FROM
    leads;

MySQL IFNULL function example

Hàm COALESCE nhận vào 1 danh sách các tham số và trả về tham số không NULL đầu tiên. Ví dụ dưới đây hiển thị thông tin của lead theo thứ tự thông tin sắp xếp là phone, email, và N/A.

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

MySQL COALESCE function example

Hàm NULLIF nhận 2 tham số, nếu 2 tham số bằng nhau, hàm sẽ trả về NULL, nếu không thì trả về tham số đầu tiên.

Hàm NULLIF hữu ích khi bạn có cả NULL và chuỗi rỗng trong 1 cột. Ví dụ, giả sử insert lỗi bản ghi vào bảng leads:

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('Thierry','Henry','Web Search','[email protected]','');

phone là chuỗi rỗng thay vì NULL

Nếu bạn muốn lấy thông tin của leads, bạn sẽ nhận được một phone rỗng thay vì email nếu sử dụng câu truy vấn sau:

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

MySQL NULL and Empty String

Để xử lý lỗi này thì bạn sử dụng hàm NULLIF để so sánh phone với chuỗi rỗng, nếu chúng bằng nhau thì trả về NULL bằng không thì trả về giá trị của phone.

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(NULLIF(phone, ''), email, 'N/A') contact
FROM
    leads;

MySQL NULLIF function example