Null là gì và cách xử lý Null trong SQL Server

Ngày đăng: 23/01/2024

Null là gì?

Null không phải một kiểu giá trị, Null là một trạng thái không có dữ liệu.

Lưu ý: NULL không tương đương với giá trị 0 hay dấu cách, dấu nháy đơn.

Giả sử, ta có thông tin bảng DimEmployee như sau: 

Trong cột MiddleName, có những ô ở trạng thái không có dữ liệu (NULL).

Null là gì và cách xử lý Null trong SQL Server

Thông tin bảng DimEmployee 

Đặc điểm thường gặp của NULL 

NULL có 3 đặc tính quan trọng chúng ta cần luôn nắm được, đó là:

  1. Mọi phép toán với NULL đều trả về NULL 
  2. Mọi so sánh logic với NULL đều trả về FALSE 
  3. Các phép toán tổng hợp dữ liệu không tính đến NULL 

3 đặc tính này đã được chúng mình giải đáp chi tiết trong video và blog dưới đây:

Và để tránh kết quả gặp phải tình trạng thiếu, thừa dữ liệu hoặc đi lệch với yêu cầu của mình, bạn cần lưu ý xử lý NULL một cách hiệu quả trước đó. 

Cách xử lý Null trong SQL Server 

Kiểm tra những dòng bị Null 

Để làm rõ nguyên nhân gây ra NULL và xác định cách xử lý hợp lý, trước hết cần tìm ra và hiển thị những dòng bị NULL trong bảng dữ liệu hiện tại. 

Cụ thể trong SQL Server, điều kiện IS NULL được sử dụng để trả về các hàng chứa giá trị NULL trong một cột.  

Cú pháp của nó như sau: 

SELECT column_name1, column_name2, column_name3, ... , column_nameN 
FROM table_name 
WHERE column_nameN IS NULL

Ví dụ: Giả sử, lọc ra những dòng MiddleName NULL trong bảng DimEmployee: 

SELECT FirstName, LastName, MiddleName  
FROM DimEmployee 
WHERE MiddleName IS NULL

Kết quả trả về những dòng có MiddleName NULL 

Ngược lại, để truy vấn những dòng không NULL ta sử dụng điều kiện IS NOT NULL như sau: 

SELECT FirstName, LastName, MiddleName  
FROM DimEmployee 
WHERE MiddleName IS NOT NULL

Kết quả trả về những dòng MiddleName có giá trị  


Khởi đầu với SQL, bạn sẽ thấy dữ liệu không còn là thứ khó hiểu. Mentor tại Datapot sẽ cùng bạn luyện từng truy vấn, sửa từng lỗi – bắt đầu từ lộ trình Data Analytics Foundation Plus nhé.


Bắt đầu xử lý NULL

Sử dụng hàm ISNULL 

Để xử lý NULL, SQL Server cung cấp một số hàm giúp xử lý như sau. 

ISNULL(): Hàm ISNULL() cho phép chúng ta thay thế các giá trị NULL bằng một giá trị được chỉ định. 

ISNULL (expression, replacement) 
  • Expression: Cột mà chúng ta muốn kiểm tra giá trị NULL. 
  • Replacement: giá trị mà chúng ta muốn thay thế cho giá trị NULL. 

Ví dụ: Trong truy vấn sau, hàm ISNULL() thay thế các giá trị NULLbằng giá trị được chỉ định. 

Thay thế các giá trị MiddleName NULL bằng ‘P’: 

SELECT FirstName, LastName, MiddleName  
, ISNULL(MiddleName, 'P') as New_MiddleName 
FROM DimEmployee

Những dòng MiddleName NULL đã được thay thế bằng ‘P’ với hàm ISNULL()  

Sử dụng hàm COALESCE 

COALESCE(): Hàm COALESCE() nhận tham số không giới hạn và trả về biểu thức không null đầu tiên trong danh sách. 

COALESCE(val1, val2, ...., val_n) 

Ví dụ: Tạo cột xưng hô Object dựa vào giá trị trường Title. Nếu Title Null trả về Suffix, nếu Suffix Null trả về FirstName. 

SELECT FirstName, LastName, MiddleName, Title, Suffix,  
COALESCE(Title,Suffix,FirstName) as 'Object' 
FROM DimEmployee

Tại dòng số 1, khi Title = ‘Mr’, kết quả là ‘Mr’. Trong khi đó, tại dòng số 5, khi Title và Suffix NULL, COALESCE chọn tham số thứ 3 là FirstName, là giá trị đầu tiên không NULL ,để lấy giá trị. 

Sử dụng hàm CASE WHEN 

Với hàm CASE WHEN, bạn có thể fill NULL dựa vào nhiều điều kiện khác nhau. 

Ví dụ: Hãy fill NULL cho Title sử dụng quy tắc sau:  

Nếu Gender = ‘M’ trả về Title là ‘Mr’.  

Nếu Gender = ‘F’ và  MaritalStatus = ‘M‘ trả về ‘Mrs’ 

Nếu Gender = ‘F’ và  MaritalStatus = ‘S’ trả về  ‘Ms’ 

SELECT FirstName, LastName, MiddleName, Title, Gender, MaritalStatus 
, CASE WHEN Title IS NOT NULL THEN Title 
WHEN Gender = 'M' then 'Mr' 
WHEN Gender = 'F' and MaritalStatus = 'M' then 'Mrs' 
WHEN Gender = 'F' and MaritalStatus = 'S' then 'Ms' END AS 'New_Title' 
FROM DimEmployee

Fill Null với CASE WHEN 

Cách sử dụng hàm Aggregate Function với Null 

Hàm Count

Hàm COUNT() được sử dụng để lấy tổng số hàng trong tập kết quả. Khi chúng ta sử dụng hàm này với dấu sao, nó sẽ đếm tất cả các hàng trong bảng bất kể giá trị NULL. 

Bảng DimProduct chứa những giá trị NULL trong ListPrice 

COUNT(*) sẽ tính hết số dòng gồm bất kể các column này có cell ở trạng thái là NULL hoặc không NULL. Ngược lại, COUNT 1 cột chứa giá trị NULL, kết quả sẽ chỉ trả về số dòng không NULL. 

Chênh lệch giữa tổng số dòng tính bằng 2 cách 

Để tính tổng số dòng ListPrice, ta sẽ kết hợp thêm hàm ISNULL (hoặc COALESCE, CASE WHEN): 

SELECT COUNT(ISNULL(ListPrice,0)) as Nbr_of_ListPrice 
FROM DimProduct

Sử dụng ISNULL và COUNT để tính số lượng dòng  

Hàm AVG 

Tương tự hàm COUNT, hàm AVG trên một cột sẽ chỉ xét trên những dòng không NULL và bỏ qua những dòng bị NULL.  

Trên thực tế, có những trường hợp yêu cầu tính Trung bình trên tất cả các dòng, vì thế đòi hỏi cần phải fill NULL lúc này. 

Giống như hàm COUNT, ta sẽ dùng kết hợp AVG và ISNULL (hoặc COALESCE, CASE WHEN): 

AVG(ISNULL()) trả ra kết quả giống cách tính Trung Bình thủ công trên toàn bảng  

Sau khi sử dụng ISNULL để fill giá trị 0 vào những dòng ListPrice NULL, hàm AVG đã được tính trên tất cả dòng của bảng. 

Trên đây là cách để xác định và xử lý NULL trong dữ liệu. Do NULL trong một số trường hợp có thể dẫn đến thiếu, thừa thông tin, kết quả tính toán sai mục đích ban đầu, vì vậy, việc xử lý NULL đúng cách và hiệu quả là việc rất cần thiết trong bước tiền xử lý dữ liệu. Cách xử lý sẽ bao gồm những cách cơ bản như ISNULL() cho đến phức tạp với nhiều điều kiện hơn như COALESCE(), CASE WHEN. Hy vọng bài viết có thể cung cấp thêm thông tin để có thể ứng dụng trong các bài toán thực tế. 

Bài viết liên quan: 3 Lỗi thường gặp khi xử lý NULL trong SQL


Khởi đầu với SQL, bạn sẽ thấy dữ liệu không còn là thứ khó hiểu. Mentor tại Datapot sẽ cùng bạn luyện từng truy vấn, sửa từng lỗi – bắt đầu từ lộ trình Data Analytics Foundation Plus nhé.


Kết nối thêm với chúng mình 

Fanpage 

Cộng đồng Data, AI và Tự động hóa 200,000+ thành viên 

Youtube 

Zalo 

Chúc bạn luôn thành công trong công việc và cuộc sống! 

Chia sẻ bài viết này

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

This site uses Akismet to reduce spam. Learn how your comment data is processed.