top of page

Null là gì? Giải thích chi tiết cho người mới học Data Analytics

  • 20 giờ trước
  • 8 phút đọc

Bạn vừa được giao một file dữ liệu khách hàng để phân tích. Mở lên, bạn thấy cột "email" có nhiều ô trống. Câu hỏi đặt ra: những ô trống đó là khách hàng chưa cung cấp email, hay email là chuỗi rỗng, hay đơn giản là dữ liệu bị mất? Ba trường hợp này nhìn giống nhau nhưng bản chất hoàn toàn khác - và cách bạn xử lý sẽ ảnh hưởng trực tiếp đến số liệu báo cáo.

Đây chính là lúc khái niệm NULL xuất hiện. Với người mới học Data Analytics, hiểu đúng về NULL là một trong những bước nền tảng quan trọng nhất, bởi vì gần như mọi truy vấn SQL, mọi phép tính thống kê, và mọi báo cáo bạn làm sau này đều sẽ phải "đụng" đến NULL.

Bài viết này sẽ giải thích NULL là gì, vì sao nó quan trọng, cách phân biệt với các giá trị "trông giống NULL", và cách xử lý NULL trong SQL — kèm ví dụ thực tế để bạn áp dụng được ngay.


Null là gì?

NULL là một giá trị đặc biệt trong cơ sở dữ liệu, biểu thị "không có giá trị" hoặc "giá trị chưa biết".

Nói cách khác, khi một ô dữ liệu mang giá trị NULL, điều đó có nghĩa là: ta không biết giá trị thực ở đó là gì. Nó có thể tồn tại nhưng chưa được ghi nhận, hoặc không áp dụng được cho dòng dữ liệu đó.

iều quan trọng cần ghi nhớ ngay từ đầu:

  • NULL không phải là số 0

  • NULL không phải là chuỗi rỗng ("")

  • NULL không phải là FALSE

  • NULL không bằng chính nó (NULL = NULL trả về NULL, không phải TRUE)

Hãy xem ví dụ một bảng customers đơn giản:

customer_id

name

email

phone

age

1

An

901234567

25

2

Bình

NULL

907654321

30

3

Chi

NULL

NULL

4

Dũng

""

909999999

0

Ở đây:

  • Khách hàng số 2: email là NULL → ta không biết email của Bình

  • Khách hàng số 3: phone và age là NULL → thông tin chưa được thu thập

  • Khách hàng số 4: email là chuỗi rỗng và age là 0 → đây là giá trị có thực, không phải NULL

Sự khác biệt tinh tế này chính là nguồn gốc của rất nhiều lỗi sai trong báo cáo dữ liệu.


Phân biệt NULL với các giá trị "trông giống NULL"

NULL vs 0

Đây là nhầm lẫn phổ biến nhất với người mới. Số 0 là một giá trị có thực — nó cho ta biết "có dữ liệu, và dữ liệu đó bằng 0". Còn NULL là "không có dữ liệu, không biết giá trị là gì".

Ví dụ: cột revenue của một khách hàng.

  • revenue = 0 → khách hàng có giao dịch, nhưng tổng doanh thu là 0 đồng

  • revenue = NULL → khách hàng chưa có giao dịch nào, hoặc dữ liệu chưa được ghi nhận

Hai trường hợp này khi tính trung bình (AVG) sẽ cho kết quả hoàn toàn khác nhau.


NULL vs chuỗi rỗng ("")

Chuỗi rỗng "" là một chuỗi có tồn tại nhưng không chứa ký tự nào. NULL thì là không có chuỗi nào cả.

Hầu hết các hệ quản trị cơ sở dữ liệu (MySQL, PostgreSQL, SQL Server) đều phân biệt rõ ràng giữa "" và NULL. Riêng Oracle là một ngoại lệ đặc biệt: Oracle coi chuỗi rỗng '' như NULL — tức là không phân biệt hai giá trị này. Đây là cái bẫy thường gặp khi chuyển code SQL giữa các hệ cơ sở dữ liệu, nên bạn cần lưu ý.


NULL vs khoảng trắng (" ")

Khoảng trắng (" ") là một chuỗi chứa ký tự space — nó có giá trị, dù mắt thường không nhìn thấy. NULL thì không có gì cả.

Đây là cái bẫy hay gặp khi import dữ liệu từ Excel/CSV: nhiều ô "tưởng là trống" thật ra chứa khoảng trắng, dẫn đến việc bộ lọc IS NULL không bắt được chúng.


Bảng so sánh nhanh

Giá trị

Có dữ liệu không?

Kiểu

Ý nghĩa

NULL

Không

Không có

Không xác định / chưa biết

0

Số

Giá trị là 0

""

Chuỗi

Chuỗi rỗng

" "

Chuỗi

Chuỗi chứa khoảng trắng

FALSE

Boolean

Giá trị logic sai


Vì sao NULL quan trọng trong Data Analytics?

Hiểu NULL không chỉ là chuyện lý thuyết — nó ảnh hưởng trực tiếp đến mọi con số bạn report.

Thứ nhất, NULL ảnh hưởng đến các phép tính tổng hợp. Các hàm như SUM, AVG, COUNT xử lý NULL theo cách riêng. Cụ thể:

  • SUM(column) sẽ bỏ qua các giá trị NULL

  • AVG(column) cũng bỏ qua NULL khi tính trung bình (chia cho số dòng không-NULL)

  • COUNT(column) chỉ đếm các dòng có giá trị, không đếm NULL

  • COUNT(*) thì đếm tất cả các dòng, kể cả dòng toàn NULL

Hệ quả: nếu bạn tính "doanh thu trung bình mỗi khách hàng" mà có nhiều khách hàng NULL doanh thu, kết quả sẽ bị lệch — vì AVG bỏ qua họ thay vì coi họ là 0.


Thứ hai, NULL ảnh hưởng đến kết quả JOIN. Khi JOIN hai bảng dựa trên cột chứa NULL, các giá trị NULL không match với bất kỳ giá trị nào — kể cả NULL ở bảng kia (vì NULL = NULL trả về NULL, không phải TRUE). Với INNER JOIN, các dòng có NULL ở cột join sẽ bị loại khỏi kết quả.

Riêng LEFT JOIN thì khác: các dòng từ bảng trái vẫn xuất hiện trong kết quả, chỉ là các cột từ bảng phải sẽ là NULL nếu không match được. Nhiều bạn newbie hay thắc mắc "sao tôi LEFT JOIN mà vẫn mất dòng?" — thường lỗi nằm ở chỗ:

  • Tưởng dùng LEFT JOIN nhưng thật ra viết INNER JOIN

  • Có điều kiện WHERE sau LEFT JOIN vô tình lọc mất các dòng NULL ở bảng phải (nên dùng điều kiện trong ON thay vì WHERE)


Thứ ba, NULL có thể dẫn đến kết luận sai trong báo cáo. Ví dụ: bạn báo cáo "20% khách hàng không mua hàng tháng này", nhưng thật ra 20% đó là khách hàng có dữ liệu NULL — họ có thể đã mua nhưng chưa được ghi nhận, hoặc không tồn tại trong hệ thống tháng này. Hai kết luận khác nhau hoàn toàn.


Cách kiểm tra và xử lý NULL trong SQL

Phần này là phần thực hành quan trọng nhất. Cú pháp dưới đây dựa trên chuẩn ANSI SQL, có chú thích rõ khi nào là cú pháp riêng của từng hệ DBMS.


Dùng IS NULL và IS NOT NULL

Đây là cách duy nhất đúng để kiểm tra NULL. Tuyệt đối không dùng = hoặc !=.

Ví dụ SQL: dùng IS NULL và IS NOT NULL để kiểm tra giá trị NULL, không dùng dấu bằng
Cách đúng để kiểm tra NULL trong SQL - dùng IS NULL, không bao giờ dùng = NULL

Hàm COALESCE() — chuẩn ANSI SQL

COALESCE() trả về giá trị không-NULL đầu tiên trong danh sách. Đây là hàm chuẩn ANSI SQL, chạy được trên mọi hệ cơ sở dữ liệu phổ biến.

Ví dụ hàm COALESCE trong SQL thay thế giá trị NULL bằng giá trị mặc định
Dùng COALESCE để xử lý NULL trong cột email và phone

Các hàm thay thế tương đương theo từng DBMS

Mỗi hệ cơ sở dữ liệu có cú pháp riêng đơn giản hơn COALESCE khi chỉ cần thay 2 giá trị:

DBMS

Hàm thay thế NULL

Ví dụ

MySQL, SQLite

IFNULL(a, b)

IFNULL(revenue, 0)

SQL Server

ISNULL(a, b)

ISNULL(revenue, 0)

Oracle

NVL(a, b)

NVL(revenue, 0)

Mọi DBMS

COALESCE(a, b)

COALESCE(revenue, 0)

Lời khuyên: dùng COALESCE để code chạy được mọi nơi, không bị phụ thuộc vào DBMS.


Hàm NULLIF()

NULLIF(a, b) là chuẩn ANSI SQL, trả về NULL nếu a = b. Hữu ích khi muốn "chuyển ngược" chuỗi rỗng thành NULL để xử lý đồng nhất:

Ví dụ hàm NULLIF trong SQL chuyển chuỗi rỗng thành giá trị NULL
Dùng NULLIF để làm sạch dữ liệu — chuyển chuỗi rỗng thành NULL

Xử lý NULL trong GROUP BY và ORDER BY

Khi GROUP BY một cột có NULL, tất cả các dòng NULL sẽ được gộp thành một nhóm duy nhất.

Khi ORDER BY, vị trí của NULL khác nhau tùy DBMS:

DBMS

ORDER BY ASC

ORDER BY DESC

PostgreSQL, Oracle

NULL ở cuối

NULL ở đầu

MySQL, SQL Server

NULL ở đầu

NULL ở cuối

Để chủ động kiểm soát vị trí NULL (PostgreSQL, Oracle hỗ trợ), dùng NULLS FIRST / NULLS LAST:

Cú pháp ORDER BY NULLS LAST trong SQL để đẩy giá trị NULL xuống cuối kết quả
Kiểm soát vị trí NULL khi sắp xếp với NULLS LAST (PostgreSQL, Oracle)

4 cách xử lý dữ liệu NULL phổ biến

Không có một cách "đúng" cho mọi trường hợp — chọn cách nào phụ thuộc vào bối cảnh dữ liệu.

Cách 1: Giữ nguyên NULL. Nếu NULL mang ý nghĩa (ví dụ: "khách hàng chưa từng mua hàng" khác với "khách hàng mua 0 đồng"), hãy giữ nguyên. Đừng cố "làm sạch" bằng cách thay thế tùy tiện.


Cách 2: Xóa dòng chứa NULL. Áp dụng khi tỷ lệ NULL nhỏ (dưới 5%) và việc thiếu dữ liệu không ảnh hưởng đến tính đại diện của mẫu. Cẩn thận: nếu xóa quá nhiều, bạn có thể làm sai lệch phân phối dữ liệu.


Cách 3: Thay thế bằng giá trị mặc định (imputation). Các giá trị thường dùng:

  • Số học: thay bằng trung bình (mean), trung vị (median), hoặc 0

  • Văn bản: thay bằng "Unknown", "N/A", hoặc chuỗi rỗng

  • Thời gian: thay bằng ngày mặc định, hoặc ngày trung bình


Cách 4: Đánh dấu thành cột flag riêng. Tạo thêm một cột is_missing để đánh dấu các dòng từng có NULL, rồi mới impute. Cách này giữ được thông tin "dữ liệu này từng bị thiếu" để dùng cho phân tích sâu hơn.


Lỗi thường gặp khi làm việc với NULL

Lỗi 1: Dùng = NULL thay vì IS NULL. Câu query sẽ chạy không báo lỗi nhưng trả về kết quả rỗng, khiến bạn tưởng "bảng không có NULL". Luôn dùng IS NULL / IS NOT NULL.


Lỗi 2: Nhầm lẫn COUNT(column) và COUNT(*).

So sánh COUNT column và COUNT sao trong SQL khi cột chứa giá trị NULL
COUNT(email) bỏ qua NULL — COUNT(*) đếm tất cả dòng

Nếu bạn báo cáo "có 80 khách hàng" khi sếp hỏi tổng số, đó là sai.


Lỗi 3: Phép so sánh với NULL không trả về TRUE/FALSE. Trong SQL, mọi phép so sánh với NULL đều trả về NULL (chứ không phải FALSE). Mệnh đề WHERE chỉ giữ lại các dòng có điều kiện = TRUE — do đó các dòng NULL bị loại bỏ:

Lỗi WHERE so sánh không bằng với NULL trong SQL và cách sửa đúng
Khi WHERE age <> 30 âm thầm bỏ qua các dòng NULL — cách sửa

Lỗi 4: Quên NULL trong phép tính. Khi cộng total = price + tax, nếu tax là NULL thì total cũng là NULL (bất kỳ phép toán nào với NULL đều ra NULL). Luôn dùng COALESCE để bảo vệ:

Dùng COALESCE để xử lý NULL trong phép cộng SQL tránh kết quả NULL
Bọc COALESCE(tax, 0) để phép cộng không bị "nhiễm" NULL

Tổng kết

Ba điều cốt lõi cần nhớ về NULL:

  1. NULL là "không biết", không phải "không có" hay "bằng 0". Đây là giá trị đặc biệt, không thuộc về kiểu dữ liệu nào.

  2. Luôn dùng IS NULL / IS NOT NULL để kiểm tra, không bao giờ dùng = hay !=.

  3. Xử lý NULL phải có chủ đích — giữ nguyên, xóa, hay thay thế đều có ngữ cảnh phù hợp riêng. Đừng làm theo phản xạ.

Hiểu NULL là bước đầu để viết những câu SQL chính xác và làm báo cáo đáng tin cậy. Khi đã nắm vững, bạn sẽ thấy NULL không còn là "kẻ thù" mà là một công cụ cho ta biết: ở đây có một câu chuyện chưa được kể.


Bạn muốn đi xa hơn với Data Analytics?

Hiểu NULL mới chỉ là viên gạch đầu tiên. Để trở thành một Data Analyst thực thụ - biết cách kết hợp SQL, Python, BI tools và đặc biệt là AI Agents vào quy trình phân tích - bạn cần một lộ trình bài bản.


👉 Xem chi tiết chương trình khóa học Agentic AI Analytics & Business Intelligence tại đây

Hoặc nếu muốn được tư vấn cụ thể cho ngành và vị trí của bạn, nhắn tin trực tiếp qua Fanpage MDA để được hỗ trợ miễn phí.

Bình luận


bottom of page