- 1 1. Giới thiệu
- 2 2. Cơ bản về NULL
- 3 3. Cách thao tác NULL
- 4 4. Tìm kiếm Dữ liệu Bao gồm NULL
- 5 5. NULL, Chỉ mục và Hiệu năng
- 6 6. NULL và Sắp xếp
- 7 7. Các hàm hữu ích để xử lý NULL
- 8 8. Các thực hành tốt nhất để xử lý NULL
- 9 9. Câu hỏi thường gặp (FAQ)
- 9.1 Q1: Sự khác nhau giữa NULL, chuỗi rỗng (“”), và số 0 (0) là gì?
- 9.2 Q2: Tại sao NULL = NULL không trả về TRUE?
- 9.3 Q3: Tôi cần lưu ý gì khi tìm kiếm dữ liệu có chứa NULL?
- 9.4 Q4: Có những lưu ý nào liên quan đến NULL và chỉ mục không?
- 9.5 Q5: Sự khác nhau giữa COALESCE và IFNULL là gì?
- 9.6 Q6: How can I design my database to avoid NULL?
- 9.7 Q7: Do aggregate functions behave differently with NULL?
- 9.8 Q8: Can NULL cause issues in JOIN operations?
- 9.9 Summary
- 10 10. Conclusion
1. Giới thiệu
MySQL là một hệ quản trị cơ sở dữ liệu được sử dụng trong nhiều ứng dụng và hệ thống. Trong MySQL, khái niệm NULL là một trong những chủ đề có thể gây khó khăn cho người mới bắt đầu. Hiểu đúng NULL là gì và cách xử lý nó là vô cùng quan trọng khi làm việc với MySQL.
Trong bài viết này, chúng tôi cung cấp một giải thích toàn diện—từ định nghĩa cơ bản của NULL trong MySQL đến cách thao tác với nó, cách tìm kiếm với nó, các hàm hữu ích liên quan đến NULL, và những điểm quan trọng cần lưu ý. Chúng tôi cũng bao gồm một phần FAQ trả lời các câu hỏi thường gặp về NULL.
Bài viết này hướng tới các độc giả như:
- Người mới bắt đầu sử dụng MySQL lần đầu
- Người học trung cấp đã hiểu cơ bản SQL và muốn học sâu hơn
- Kỹ sư tham gia vào thiết kế và vận hành cơ sở dữ liệu
Khi đọc xong bài viết, bạn sẽ có thể:
- Hiểu đúng NULL là gì
- Thao tác và tìm kiếm dữ liệu có chứa NULL
- Nắm các thực hành tốt nhất để tránh rắc rối liên quan đến NULL
Bây giờ, hãy cùng đi qua các nền tảng cơ bản của NULL từng bước một.
2. Cơ bản về NULL
Khi làm việc với cơ sở dữ liệu, khái niệm NULL vô cùng quan trọng. Tuy nhiên, NULL cũng là một trong những yếu tố thường bị hiểu sai nhất. Trong phần này, chúng tôi giải thích chi tiết định nghĩa và các thuộc tính cơ bản của NULL.
Định nghĩa NULL
NULL đại diện cho một trạng thái đặc biệt có nghĩa là “không có giá trị” hoặc “giá trị không xác định”. Điều này khác với chuỗi rỗng (“”) hoặc số 0 (0). Dưới đây là ví dụ minh họa sự khác nhau:
- NULL : Không có giá trị (trạng thái không xác định)
- Chuỗi rỗng (“”) : Có giá trị, nhưng nội dung rỗng
- Số 0 (0) : Có giá trị, và giá trị đó là 0
Thuộc tính của NULL
- Cách NULL hoạt động trong các phép so sánh Trong SQL, NULL được xử lý bằng các quy tắc đặc biệt. Ví dụ, hãy chú ý kết quả của các phép so sánh sau đây:
SELECT NULL = NULL; -- Result: NULL SELECT NULL <> NULL; -- Result: NULL SELECT NULL IS NULL; -- Result: TRUE
- So sánh NULL với các toán tử so sánh thông thường (=, <, >, v.v.) sẽ cho kết quả NULL.
- Để đánh giá NULL đúng cách, bạn phải sử dụng
IS NULLhoặcIS NOT NULL.
- NULL trong các phép toán số học Bất kỳ phép toán số học nào có chứa NULL luôn trả về NULL. Ví dụ:
SELECT 10 + NULL; -- Result: NULL SELECT NULL * 5; -- Result: NULL
- Các phép toán logic với NULL Khi một điều kiện bao gồm NULL, kết quả cũng có thể trở thành NULL. Xem các ví dụ dưới đây:
SELECT NULL AND TRUE; -- Result: NULL SELECT NULL OR FALSE; -- Result: NULL
Tại sao NULL gây rắc rối
Nếu bạn không xử lý NULL đúng cách, có thể gặp các vấn đề như:
- Kết quả tìm kiếm không mong đợi Ví dụ, truy vấn sau loại trừ các hàng có
agelà NULL.SELECT * FROM users WHERE age > 20;
Để giải quyết, bạn cần bao gồm NULL trong điều kiện:
SELECT * FROM users WHERE age > 20 OR age IS NULL;
- Sai sót trong tính toán và hiểu sai dữ liệu trống Các hàm tổng hợp (SUM, AVG, v.v.) bỏ qua NULL khi tính toán. Do đó, các bộ dữ liệu có nhiều giá trị NULL có thể tạo ra kết quả không mong muốn.
Tóm tắt các quy tắc cơ bản của NULL
- NULL đại diện cho trạng thái “không có giá trị”.
- Vì các toán tử so sánh thông thường không xử lý NULL đúng, hãy sử dụng
IS NULLhoặcIS NOT NULL. - Nếu NULL được đưa vào các phép toán số học hoặc logic, kết quả cũng sẽ trở thành NULL.
3. Cách thao tác NULL
Khi làm việc với NULL trong MySQL, bạn cần hiểu các cách xử lý đúng. Trong phần này, chúng tôi giải thích chi tiết các phương pháp chèn, cập nhật và xóa NULL.
Cách đặt NULL khi chèn dữ liệu
Khi chèn một bản ghi mới vào cơ sở dữ liệu, bạn có thể đặt một cột thành NULL. Dưới đây là các ví dụ cụ thể.
- Rõ ràng chỉ định NULL
INSERT INTO users (name, age) VALUES ('Taro', NULL);
Trong truy vấn này, cột age không được cung cấp giá trị, và NULL được chèn vào.
- NULL làm giá trị mặc định Nếu NULL được cấu hình làm giá trị mặc định, việc bỏ qua giá trị sẽ tự động chèn NULL.
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT DEFAULT NULL ); INSERT INTO users (name) VALUES ('Hanako');
Trong ví dụ này, vì không cung cấp giá trị rõ ràng cho cột age, NULL mặc định được chèn vào.
Cách đặt NULL khi cập nhật dữ liệu
Bạn cũng có thể cập nhật dữ liệu hiện có để đặt giá trị cột thành NULL. Dưới đây là các ví dụ.
- Cập nhật giá trị thành NULL
UPDATE users SET age = NULL WHERE name = 'Taro';
Truy vấn này đặt cột age thành NULL cho bản ghi có tên là “Taro”.
- Cập nhật có điều kiện Bạn có thể thêm điều kiện để đặt NULL trong các tình huống cụ thể.
UPDATE users SET age = NULL WHERE age < 18;
Ở đây, cột age được đặt thành NULL cho tất cả các bản ghi mà tuổi nhỏ hơn 18.
Cách sử dụng NULL làm điều kiện khi xóa dữ liệu
Khi xóa dữ liệu bao gồm NULL, bạn phải bao gồm NULL trong điều kiện. Sử dụng IS NULL, không phải toán tử so sánh.
- Xóa các hàng mà một cột là NULL
DELETE FROM users WHERE age IS NULL;
Truy vấn này xóa các bản ghi mà cột age là NULL.
- Xóa các hàng NULL với nhiều điều kiện
DELETE FROM users WHERE age IS NULL AND name = 'Taro';
Trong ví dụ này, chỉ các bản ghi mà age là NULL và name là “Taro” được xóa.
Các lưu ý quan trọng khi thao tác với NULL
- Sử dụng
IS NULLđúng cách Khi sử dụng NULL trong điều kiện, luôn sử dụngIS NULLhoặcIS NOT NULL, không phải toán tử=.SELECT * FROM users WHERE age = NULL; -- Incorrect SELECT * FROM users WHERE age IS NULL; -- Correct
- Thiết kế ứng dụng của bạn với việc xử lý NULL trong đầu Khi thao tác dữ liệu từ ứng dụng, cẩn thận về cách bạn xử lý NULL giúp ngăn chặn hành vi không mong muốn.
- Sử dụng giao dịch Đối với các hoạt động dữ liệu liên quan đến NULL, hãy xem xét sử dụng giao dịch để tránh thay đổi dữ liệu không mong muốn.
4. Tìm kiếm Dữ liệu Bao gồm NULL
Khi tìm kiếm dữ liệu trong MySQL, việc xử lý NULL đúng cách là cực kỳ quan trọng. Vì NULL hoạt động khác với các giá trị thông thường, nó yêu cầu sự chú ý đặc biệt. Trong phần này, chúng tôi giải thích cách tìm kiếm hiệu quả khi liên quan đến NULL.
Các cách cơ bản để tìm kiếm NULL
Để tìm kiếm NULL, sử dụng IS NULL và IS NOT NULL thay vì các toán tử so sánh thông thường (=, <, >).
- Tìm kiếm NULL
SELECT * FROM users WHERE age IS NULL;
Truy vấn này lấy tất cả các bản ghi mà cột age là NULL.
- Tìm kiếm các giá trị không phải NULL
SELECT * FROM users WHERE age IS NOT NULL;
Truy vấn này lấy tất cả các bản ghi mà cột age không phải NULL.
Tìm kiếm với các điều kiện phức tạp bao gồm NULL
Vì NULL không thể được xử lý đúng với các toán tử so sánh, hãy cẩn thận khi sử dụng nó trong các điều kiện phức tạp.
- Bao gồm NULL trong điều kiện
SELECT * FROM users WHERE age > 20 OR age IS NULL;
Truy vấn này lấy các bản ghi mà age lớn hơn 20 hoặc là NULL.
- Toán tử NOT và NULL
SELECT * FROM users WHERE NOT (age > 20 OR age IS NULL);
Truy vấn này lấy các bản ghi mà age là 20 hoặc nhỏ hơn và không phải NULL.
Sử dụng NULL với toán tử LIKE
Toán tử LIKE không thể được sử dụng với NULL. Vì NULL nghĩa là không có giá trị tồn tại, truy vấn sau không trả về các hàng NULL:
SELECT * FROM users WHERE name LIKE '%a%';
-- NULL values are not matched by this condition
Thay vào đó, bạn cần thêm kiểm tra NULL:
SELECT * FROM users WHERE name LIKE '%a%' OR name IS NULL;
Các hàm tổng hợp và tìm kiếm với NULL
NULL bị bỏ qua bởi nhiều hàm tổng hợp (SUM, AVG, v.v.). Để có kết quả đúng, bạn cần tính đến NULL.
- Hàm COUNT
SELECT COUNT(*) AS total_records, COUNT(age) AS non_null_ages FROM users;
COUNT(*): Đếm tất cả bản ghi, bao gồm cả những bản ghi có NULLCOUNT(column): Đếm các bản ghi không có NULL- Các hàm tổng hợp khác
SELECT AVG(age) AS average_age FROM users WHERE age IS NOT NULL;
Điều này tính trung bình mà không tính các giá trị NULL.
Ghi chú khi tìm kiếm NULL
- Sự khác biệt giữa
IS NULLvà=Vì NULL không thể được xử lý bằng các phép so sánh thông thường, luôn sử dụngIS NULLhoặcIS NOT NULL.SELECT * FROM users WHERE age = NULL; -- Incorrect SELECT * FROM users WHERE age IS NULL; -- Correct
- Xử lý nhiều điều kiện Nếu có khả năng NULL xuất hiện, bạn phải bao gồm nó một cách rõ ràng trong điều kiện để tránh kết quả không mong muốn.
SELECT * FROM users WHERE age > 20; -- NULL is excluded SELECT * FROM users WHERE age > 20 OR age IS NULL; -- Includes NULL
- Ảnh hưởng đến hiệu năng Khi bao gồm NULL trong các điều kiện, việc sử dụng chỉ mục có thể bị hạn chế trong một số trường hợp. Chúng tôi khuyên bạn nên kiểm tra hiệu quả của chỉ mục.
EXPLAIN SELECT * FROM users WHERE age IS NULL;
Tóm tắt
Tìm kiếm NULL một cách chính xác là điều cần thiết để đạt được kết quả mong muốn. Khi tìm kiếm dữ liệu có chứa NULL, hãy sử dụng IS NULL và IS NOT NULL một cách phù hợp, và cân nhắc các ảnh hưởng đến hiệu năng và chỉ mục.
5. NULL, Chỉ mục và Hiệu năng
Để tối ưu hiệu năng cơ sở dữ liệu, việc sử dụng chỉ mục một cách đúng đắn là rất quan trọng. Tuy nhiên, các thao tác trên các cột chứa NULL có thể ảnh hưởng đến hiệu quả của chỉ mục. Trong phần này, chúng tôi sẽ giải thích mối quan hệ giữa NULL và chỉ mục, ảnh hưởng của chúng đến hiệu năng, và các chiến lược tối ưu hoá.
Tạo chỉ mục trên các cột có chứa NULL
Trong MySQL, bạn có thể tạo chỉ mục trên các cột chứa NULL. Ví dụ:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
age INT,
INDEX (age)
);
Trong trường hợp này, chỉ mục trên cột age vẫn hợp lệ ngay cả khi cột này chứa các giá trị NULL.
Sử dụng chỉ mục với IS NULL và IS NOT NULL
Khi tìm kiếm với các điều kiện bao gồm NULL, chỉ mục có thể được sử dụng hoặc không tùy thuộc vào truy vấn.
- Khi chỉ mục được sử dụng
SELECT * FROM users WHERE age IS NULL;
Trong truy vấn này, chỉ mục có thể được sử dụng, cho phép tìm kiếm hiệu quả.
- Khi chỉ mục không được sử dụng Nếu bạn sử dụng các điều kiện phức tạp như sau, chỉ mục có thể không được áp dụng.
SELECT * FROM users WHERE age + 1 IS NULL;
Việc chỉ mục có được sử dụng hay không phụ thuộc vào cấu trúc của điều kiện truy vấn.
NULL và chỉ mục tổng hợp
Ngay cả khi sử dụng chỉ mục tổng hợp, các cột chứa NULL cũng được xử lý đặc biệt.
- Ví dụ về chỉ mục tổng hợp
CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, department_id INT, salary INT, INDEX (department_id, salary) );
Nếu department_id là NULL, một phần của chỉ mục tổng hợp (department_id, salary) có thể không được sử dụng đầy đủ.
Ảnh hưởng đến hiệu năng của NULL
- Hiệu quả của chỉ mục
- Các tìm kiếm có điều kiện bao gồm NULL thường vẫn hưởng lợi từ chỉ mục. Tuy nhiên, nếu điều kiện trở nên phức tạp, việc sử dụng chỉ mục có thể bị hạn chế.
- Lượng dữ liệu lớn
- Nếu có nhiều giá trị NULL trong một cột được chỉ mục, kích thước chỉ mục có thể tăng và có khả năng làm giảm hiệu năng truy vấn.
- Chiến lược thiết kế để tránh NULL quá mức
- Đối với các cột thường chứa NULL, việc định nghĩa giá trị mặc định để giảm việc sử dụng NULL có thể cải thiện hiệu năng trong một số trường hợp.
Mẹo tối ưu hoá hiệu năng
- Xác minh việc sử dụng chỉ mục Sử dụng
EXPLAINđể kiểm tra xem chỉ mục có được áp dụng hay không:EXPLAIN SELECT * FROM users WHERE age IS NULL;
- Thiết kế để giảm thiểu NULL Áp dụng ràng buộc
NOT NULLvà giá trị mặc định để tránh NULL trong lược đồ của bạn:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, age INT NOT NULL DEFAULT 0 );
- Đánh giá lại các chỉ mục Tùy thuộc vào khối lượng dữ liệu và mẫu truy vấn, hãy cân nhắc thêm hoặc loại bỏ các chỉ mục để tối ưu hiệu suất.
Tóm tắt
NULL có thể cùng tồn tại với các chỉ mục, nhưng trong một số điều kiện nhất định nó có thể ảnh hưởng đến hiệu suất. Bằng cách thiết kế các chiến lược chỉ mục phù hợp và xác định chính sách rõ ràng cho việc sử dụng NULL, bạn có thể đạt được các hoạt động cơ sở dữ liệu hiệu quả.
6. NULL và Sắp xếp
Khi sắp xếp dữ liệu trong MySQL, việc hiểu cách NULL được xử lý là rất quan trọng. Vì NULL hành xử khác với các giá trị bình thường, việc nắm rõ thứ tự sắp xếp mặc định và cách tùy chỉnh nó sẽ giúp bạn đạt được kết quả mong muốn. Trong phần này, chúng tôi giải thích các quy tắc cơ bản và kỹ thuật nâng cao để sắp xếp với NULL.
Thứ tự sắp xếp mặc định của NULL
Trong MySQL, NULL được xử lý như sau:
- Tăng dần (ASC) : Các giá trị NULL xuất hiện trước.
- Giảm dần (DESC) : Các giá trị NULL xuất hiện cuối.
Ví dụ:
SELECT * FROM users ORDER BY age ASC;
-- NULL appears first
SELECT * FROM users ORDER BY age DESC;
-- NULL appears last
Kiểm soát vị trí của NULL một cách rõ ràng
Bạn có thể ghi đè hành vi sắp xếp mặc định để buộc các giá trị NULL xuất hiện đầu hoặc cuối.
- Đặt giá trị NULL lên đầu
SELECT * FROM users ORDER BY age IS NULL DESC, age ASC;
Trong truy vấn này, các dòng có age là NULL xuất hiện đầu tiên, sau đó là các dòng không NULL được sắp xếp tăng dần.
- Đặt giá trị NULL xuống cuối
SELECT * FROM users ORDER BY age IS NULL ASC, age ASC;
Ở đây, các giá trị không NULL xuất hiện đầu tiên, và các giá trị NULL được đặt ở cuối.
Sắp xếp theo nhiều cột có NULL
Khi sắp xếp theo nhiều cột, bạn có thể chỉ định cách xử lý NULL cho từng cột.
- Ví dụ với nhiều điều kiện
SELECT * FROM users ORDER BY department_id ASC, age IS NULL DESC, age ASC;
Truy vấn này sắp xếp dữ liệu theo thứ tự sau:
department_idtheo thứ tự tăng dần- Các dòng có
agelà NULL - Các giá trị
agekhông NULL theo thứ tự tăng dần
Hiệu suất sắp xếp và NULL
Khi sắp xếp trên một cột chứa NULL, việc có sử dụng chỉ mục hay không phụ thuộc vào cấu trúc truy vấn. Nếu không sử dụng chỉ mục, việc sắp xếp có thể mất nhiều thời gian hơn.
- Kiểm tra việc sử dụng chỉ mục
EXPLAIN SELECT * FROM users ORDER BY age ASC;
Sử dụng EXPLAIN để xác minh xem chỉ mục có được áp dụng hay không.
Lưu ý quan trọng khi sắp xếp
- Xem xét kiểu dữ liệu của cột
- Nếu một cột chứa NULL có kiểu dữ liệu không phù hợp, có thể xảy ra kết quả không mong muốn. Hãy chú ý đặc biệt đến sự khác biệt giữa kiểu số và kiểu chuỗi.
- Làm rõ các điều kiện sắp xếp
- Để làm rõ kết quả truy vấn, sử dụng
IS NULLhoặcIS NOT NULLkhi xử lý NULL một cách có chủ đích.SELECT * FROM users WHERE age IS NULL ORDER BY age DESC;
Tóm tắt
Mặc định, NULL xuất hiện đầu tiên trong sắp xếp tăng dần và cuối cùng trong sắp xếp giảm dần. Tuy nhiên, bạn có thể tùy chỉnh truy vấn để kiểm soát vị trí của các giá trị NULL. Bằng cách chỉ định các điều kiện phù hợp, bạn có thể đạt được thứ tự sắp xếp mong muốn. 
7. Các hàm hữu ích để xử lý NULL
MySQL cung cấp một số hàm tiện lợi để xử lý NULL một cách hiệu quả. Bằng cách sử dụng các hàm này, bạn có thể viết truy vấn sạch hơn và xử lý dữ liệu hiệu quả hơn khi có các giá trị NULL. Trong phần này, chúng tôi giải thích các hàm được sử dụng phổ biến nhất và cách sử dụng chúng.
Hàm COALESCE
COALESCE trả về giá trị không NULL đầu tiên trong các đối số được chỉ định. Nó hữu ích khi bạn muốn thay thế NULL bằng một giá trị mặc định.
- Cú pháp cơ bản
COALESCE(value1, value2, ..., valueN)
- Ví dụ
SELECT COALESCE(age, 0) AS adjusted_age FROM users;
Trong truy vấn này, nếu age là NULL, nó trả về 0; nếu không, nó trả về giá trị của age.
- Ví dụ với nhiều đối số
SELECT COALESCE(NULL, NULL, 'Default Value', 'Other Value') AS result;
Kết quả sẽ là “Default Value”.
Hàm IFNULL
IFNULL trả về một giá trị chỉ định nếu biểu thức là NULL. Nó tương tự như COALESCE nhưng chỉ giới hạn hai đối số.
- Cú pháp cơ bản
IFNULL(expression, alternate_value)
- Ví dụ
SELECT IFNULL(age, 0) AS adjusted_age FROM users;
Nếu age là NULL, kết quả sẽ là 0.
- Khác biệt so với COALESCE
- IFNULL chỉ chấp nhận hai đối số, trong khi COALESCE có thể chấp nhận nhiều đối số.
Toán tử So sánh An toàn NULL (<=>)
Toán tử <=> cho phép so sánh an toàn các giá trị NULL. Sử dụng toán tử này giúp so sánh trực tiếp các giá trị NULL.
- Ví dụ
SELECT * FROM users WHERE age <=> NULL;
Truy vấn này chính xác lấy các bản ghi mà age là NULL.
- Khác biệt so với toán tử bằng thông thường (=)
- Với toán tử
=,NULL = NULLtrả về NULL, nhưng với<=>, nó trả về TRUE.
Hàm ISNULL
ISNULL kiểm tra một giá trị có phải là NULL hay không. Mặc dù IS NULL và IS NOT NULL thường đủ, ISNULL hữu ích khi bạn cần một kiểm tra dựa trên hàm.
- Cú pháp cơ bản
ISNULL(expression)
- Ví dụ
SELECT ISNULL(age) AS is_null FROM users;
Nếu age là NULL, nó trả về 1; nếu không, nó trả về 0.
Hàm NULLIF
NULLIF trả về NULL nếu hai đối số bằng nhau; nếu không, nó trả về đối số đầu tiên.
- Cú pháp cơ bản
NULLIF(expression1, expression2)
- Ví dụ
SELECT NULLIF(salary, 0) AS adjusted_salary FROM employees;
Nếu salary là 0, nó trả về NULL; nếu không, nó trả về giá trị của salary.
Cách chọn hàm NULL phù hợp
- Để đặt giá trị mặc định : Sử dụng COALESCE hoặc IFNULL
- Để so sánh NULL một cách an toàn : Sử dụng toán tử <=>
- Để kiểm tra NULL một cách rõ ràng : Sử dụng ISNULL hoặc IS NULL
- Để trả về NULL trong các điều kiện cụ thể : Sử dụng NULLIF
Tóm tắt
MySQL cung cấp một bộ hàm phong phú để xử lý NULL. Bằng cách chọn hàm phù hợp, bạn có thể viết các truy vấn đơn giản và hiệu quả hơn. Sử dụng các hàm này để tối ưu cách ứng dụng của bạn xử lý các giá trị NULL.
8. Các thực hành tốt nhất để xử lý NULL
NULL đóng vai trò quan trọng trong các hoạt động cơ sở dữ liệu, nhưng do tính đặc thù của nó, cũng có thể gây nhầm lẫn và rắc rối. Bằng cách xử lý NULL đúng cách, bạn có thể duy trì tính toàn vẹn dữ liệu và đảm bảo hoạt động hiệu quả. Trong phần này, chúng tôi giải thích các thực hành tốt nhất khi làm việc với NULL.
Xử lý NULL trong thiết kế cơ sở dữ liệu
- Quyết định có cho phép NULL hay không
- NULL đại diện cho “không có giá trị nào tồn tại,” nhưng không phải mọi cột đều nên cho phép NULL.
Examples: wp:list /wp:list
- Các trường bắt buộc (ví dụ: tên người dùng, địa chỉ email) nên có ràng buộc
NOT NULL. - Các trường có thể hợp lý không có giá trị (ví dụ: điểm trung gian, cài đặt tùy chọn) có thể cho phép NULL.
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, age INT NULL );
- Các trường bắt buộc (ví dụ: tên người dùng, địa chỉ email) nên có ràng buộc
- Đặt giá trị mặc định
- Để giảm thiểu việc sử dụng NULL, định nghĩa các giá trị mặc định phù hợp khi có thể.
CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, status VARCHAR(20) NOT NULL DEFAULT 'pending' );
Quản lý NULL trong lớp ứng dụng
- Xác thực dữ liệu đầu vào
- Khi người dùng gửi dữ liệu qua biểu mẫu, xác minh rằng các trường bắt buộc đã được điền.
- Thêm xác thực phía máy chủ để ngăn các giá trị NULL không mong muốn được chèn vào cơ sở dữ liệu.
- Chuẩn hóa việc xử lý NULL
- Đảm bảo việc xử lý NULL nhất quán trong toàn bộ mã nguồn ứng dụng.
- Ví dụ: Cung cấp một hàm trợ giúp để chuyển đổi NULL thành giá trị mặc định.
def handle_null(value, default): return value if value is not None else default
Các lưu ý quan trọng khi viết truy vấn
- So sánh NULL an toàn
- Luôn sử dụng
IS NULLhoặcIS NOT NULLkhi so sánh NULL.SELECT * FROM users WHERE age IS NULL;
- Xử lý NULL trong các điều kiện phức tạp
- Khi viết truy vấn với nhiều điều kiện, cần tính đến NULL một cách rõ ràng.
SELECT * FROM users WHERE age > 20 OR age IS NULL;
- Xem xét NULL trong kết quả tổng hợp
- Các hàm tổng hợp (SUM, AVG, v.v.) bỏ qua giá trị NULL. Nếu bạn cần kiểm tra có bao nhiêu giá trị NULL, hãy thêm các điều kiện rõ ràng.
SELECT COUNT(*) AS total_records, COUNT(age) AS non_null_records FROM users;
Cải thiện hiệu suất và khả năng đọc
- Chỉ mục và NULL
- Nếu sử dụng chỉ mục trên các cột chứa nhiều giá trị NULL, hãy kiểm tra hiệu quả của chỉ mục.
- Tái tạo hoặc điều chỉnh chỉ mục khi cần thiết.
- Giảm thiểu NULL
- Giảm việc sử dụng NULL không cần thiết trong giai đoạn thiết kế giúp cải thiện khả năng đọc và hiệu suất của cơ sở dữ liệu.
- Sử dụng giá trị mặc định hoặc cờ thay vì phụ thuộc quá nhiều vào NULL.
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, age INT NOT NULL DEFAULT 0 );
Các vấn đề thực tế phổ biến và giải pháp
- Vấn đề: Kết quả tìm kiếm không mong đợi do NULL
- Giải pháp: Sử dụng đúng
IS NULLhoặcIS NOT NULLtrong truy vấn.SELECT * FROM users WHERE name = 'Taro' OR name IS NULL;
- Vấn đề: Hành vi không mong đợi trong các hàm tổng hợp
- Giải pháp: Thêm các điều kiện để loại trừ hoặc xử lý NULL một cách rõ ràng.
SELECT COUNT(age) FROM users WHERE age IS NOT NULL;
- Vấn đề: NULL và tính toàn vẹn dữ liệu
- Giải pháp: Áp dụng ràng buộc
NOT NULLở mức cơ sở dữ liệu và xác thực đầu vào ở mức ứng dụng.
Tóm tắt
NULL là một khái niệm mạnh mẽ, nhưng nếu không được xử lý đúng cách, nó có thể gây ra vấn đề. Bằng cách xác định chính sách rõ ràng trong quá trình thiết kế cơ sở dữ liệu và duy trì việc xử lý nhất quán trong ứng dụng, bạn có thể giảm thiểu các vấn đề liên quan đến NULL.
9. Câu hỏi thường gặp (FAQ)
Khi học về NULL trong MySQL, cả người mới bắt đầu và người dùng trung cấp thường có những câu hỏi tương tự. Trong phần này, chúng tôi tóm tắt các câu hỏi thường gặp và câu trả lời liên quan đến NULL.
Q1: Sự khác nhau giữa NULL, chuỗi rỗng (“”), và số 0 (0) là gì?
- A1:
- NULL: Chỉ ra rằng không có giá trị nào tồn tại (không xác định).
- Chuỗi rỗng (“”): Một giá trị tồn tại, nhưng nội dung của nó là rỗng.
- Số 0 (0): Một giá trị tồn tại, và giá trị số của nó là 0.
- Ví dụ:
INSERT INTO users (name, age) VALUES ('Taro', NULL); -- age is NULL INSERT INTO users (name, age) VALUES ('Hanako', ''); -- age is an empty string INSERT INTO users (name, age) VALUES ('Jiro', 0); -- age is zero
Q2: Tại sao NULL = NULL không trả về TRUE?
- A2:
- Theo chuẩn SQL, NULL đại diện cho “giá trị không xác định”. So sánh các giá trị không xác định sẽ cho kết quả không xác định (NULL), không phải TRUE hay FALSE.
- Khi so sánh NULL, bạn phải sử dụng
IS NULLhoặcIS NOT NULL. - Ví dụ:
SELECT NULL = NULL; -- Result: NULL SELECT NULL IS NULL; -- Result: TRUE
Q3: Tôi cần lưu ý gì khi tìm kiếm dữ liệu có chứa NULL?
- A3:
- Nếu bạn sử dụng các toán tử so sánh (=, <, >, v.v.) với NULL, bạn sẽ không nhận được kết quả mong muốn. Thay vào đó, hãy sử dụng
IS NULLhoặcIS NOT NULL. - Ví dụ:
SELECT * FROM users WHERE age = NULL; -- Incorrect SELECT * FROM users WHERE age IS NULL; -- Correct
Q4: Có những lưu ý nào liên quan đến NULL và chỉ mục không?
- A4:
- Bạn có thể tạo chỉ mục trên các cột chứa NULL, nhưng hiệu quả của chỉ mục phụ thuộc vào các điều kiện truy vấn.
- Đặc biệt, các điều kiện phức tạp (ví dụ, những điều kiện có tính toán) có thể ngăn việc sử dụng chỉ mục.
- Cách kiểm tra việc sử dụng chỉ mục:
EXPLAIN SELECT * FROM users WHERE age IS NULL;
Q5: Sự khác nhau giữa COALESCE và IFNULL là gì?
- A5:
- COALESCE : Chấp nhận nhiều đối số và trả về giá trị không NULL đầu tiên.
- IFNULL : Chấp nhận hai đối số và trả về đối số thứ hai nếu đối số đầu tiên là NULL.
- Example:
SELECT COALESCE(NULL, NULL, 'Default Value', 'Other Value'); -- Result: 'Default Value' SELECT IFNULL(NULL, 'Default'); -- Result: 'Default'
Q6: How can I design my database to avoid NULL?
- A6:
- NOT NULL constraints : Thêm ràng buộc vào các trường bắt buộc để ngăn NULL.
- Default values : Sử dụng giá trị mặc định thay cho NULL khi phù hợp.
- Example:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, age INT NOT NULL DEFAULT 0 );
Q7: Do aggregate functions behave differently with NULL?
- A7:
- Các hàm tổng hợp (SUM, AVG, COUNT, v.v.) bỏ qua các giá trị NULL. Tuy nhiên, nếu bạn muốn kiểm tra có bao nhiêu giá trị NULL, cần thêm các điều kiện rõ ràng.
- Example:
SELECT COUNT(*) AS total_records, COUNT(age) AS non_null_ages FROM users;
Q8: Can NULL cause issues in JOIN operations?
- A8:
- Khi thực hiện các phép JOIN trên các cột chứa NULL, các giá trị NULL được coi là không khớp. Do đó, bạn có thể không nhận được kết quả như mong đợi.
- Solution: Viết truy vấn có xử lý rõ ràng NULL hoặc sử dụng hàm COALESCE để thay thế NULL bằng giá trị mặc định.
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON COALESCE(t1.key, 0) = COALESCE(t2.key, 0);
Summary
NULL là một giá trị cần được xử lý đặc biệt trong các thao tác cơ sở dữ liệu MySQL. Hãy sử dụng phần FAQ này làm tài liệu tham khảo để nâng cao hiểu biết về NULL và học cách xử lý nó một cách hiệu quả.
10. Conclusion
Hiểu cách xử lý NULL trong MySQL là một kỹ năng thiết yếu trong thiết kế và vận hành cơ sở dữ liệu. Trong bài viết này, chúng tôi đã đề cập từ định nghĩa cơ bản của NULL đến các phương pháp thao tác, tìm kiếm, sắp xếp, lập chỉ mục, các hàm hữu ích và các thực tiễn tốt nhất.
Key Takeaways
- NULL basics and characteristics
- NULL biểu thị “không có giá trị” hoặc “giá trị không xác định”, khác với chuỗi rỗng (“”) hoặc số 0.
- Sử dụng
IS NULLvàIS NOT NULLđể so sánh an toàn liên quan đến NULL.
- Working with and searching NULL data
- Bạn đã học cách chèn, cập nhật, xóa và tìm kiếm dữ liệu có chứa NULL một cách đúng đắn.
- Sử dụng cú pháp và các hàm như
IS NULLvàCOALESCEcho phép thực hiện linh hoạt và hiệu quả.
- NULL and performance
- Chúng tôi đã thảo luận về ảnh hưởng của chỉ mục đối với các cột chứa NULL và các chiến lược thiết kế để tối ưu hiệu năng.
- Đặt giá trị mặc định khi phù hợp có thể giúp giảm thiểu việc sử dụng NULL quá mức.
- Convenient NULL functions
- Các hàm như COALESCE, IFNULL và NULLIF giúp giải quyết các vấn đề thường gặp liên quan đến NULL.
- Sử dụng toán tử
<=>để so sánh an toàn, tránh hành vi không mong muốn.
- Best practices
- Giảm thiểu việc sử dụng NULL không cần thiết trong thiết kế cơ sở dữ liệu và áp dụng kiểm tra hợp lệ ở lớp ứng dụng để duy trì tính toàn vẹn dữ liệu.
- Chuẩn hoá cách xử lý NULL trong các câu truy vấn SQL giúp cải thiện khả năng đọc và bảo trì.
Benefits of Understanding NULL
- Efficient data operations : Xử lý đúng cách NULL ngăn ngừa lỗi không cần thiết và cho phép viết truy vấn hiệu quả.
- Improved data integrity : Định nghĩa chính sách rõ ràng cho việc sử dụng NULL trong thiết kế cơ sở dữ liệu giúp quản lý dữ liệu nhất quán hơn.
- Increased application reliability : Xử lý đúng NULL ở lớp ứng dụng ngăn ngừa hành vi bất ngờ và lỗi.
Next Steps
Để nâng cao hiểu biết về NULL, hãy xem xét các bước sau:
- Xem lại cách NULL được sử dụng trong các dự án hiện tại và xác định các khu vực cần cải thiện.
- Thử nghiệm các hàm và toán tử như
IS NULL,COALESCEvàIFNULLtrên bộ dữ liệu thực tế. - Tinh chỉnh chỉ mục và chiến lược hiệu năng dựa trên khối lượng công việc của bạn.
Bằng cách nghiên cứu bài viết này, bạn giờ đã có hiểu biết vững chắc về cách NULL hoạt động trong MySQL và cách xử lý nó trong thực tế. Hãy sử dụng kiến thức này để cải thiện các hoạt động cơ sở dữ liệu và quy trình phát triển ứng dụng của bạn.

