Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

  1. Trang chủ
  2. Blog
  3. Cơ sở dữ liệu & SQL

Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

NULL gây ra một số lỗi thầm lặng nhất trong SQL, với các truy vấn chạy không có lỗi nhưng vẫn bị mất hàng hoặc giá trị trung bình bị lệch. Tìm hiểu cách NULL thực sự hoạt động, với các ví dụ đã được thử nghiệm và cách xử lý nó một cách an toàn.

Đọc 9 phút
Giải thích các giá trị SQL NULL: IS NULL, COALESCE, NULLIF và các bẫy cần tránh

Điểm chính

  • NULL nghĩa là giá trị bị thiếu hoặc không xác định. Nó không bằng 0 và không phải là một chuỗi rỗng.
  • Kiểm tra nó bằng IS NULL, vì = NULL không bao giờ khớp với bất cứ thứ gì.
  • Hầu hết các phép tính với NULL đều cho NULL và WHERE chỉ giữ lại những hàng chắc chắn đúng.
  • Các tập hợp bỏ qua NULL, có thể lặng lẽ thay đổi giá trị trung bình.

Một truy vấn chạy không có lỗi và trả về một số có vẻ hợp lý, nhưng các hàng bị thiếu và giá trị trung bình sai. Các giá trị SQL NULL thường là nguyên nhân. NULL không hoạt động giống như bất kỳ giá trị bình thường nào và điều đó thu hút cả những người mới bắt đầu cũng như các nhà phát triển có kinh nghiệm.

Hướng dẫn này trình bày chính xác cách hoạt động của NULL. Chúng tôi đã chạy mọi truy vấn trong SQLite 3.50 và kết quả hiển thị là từ lần chạy đó. Hầu hết hành vi này là SQL tiêu chuẩn và chúng tôi lưu ý những điểm khác nhau của cơ sở dữ liệu, chẳng hạn như thứ tự sắp xếp NULL và cách xử lý các chuỗi trống của Oracle.

NULL là gì?

NULL là điểm đánh dấu có nghĩa là giá trị bị thiếu hoặc không xác định. Nó không phải là một giá trị theo nghĩa thông thường, vì vậy đây hoàn toàn là những thứ khác nhau:

Giá trị Ý nghĩa Ví dụ về cột điện thoại
KHÔNG CÓ Không xác định hoặc không được cung cấp Chúng tôi không biết số
'' Một giá trị văn bản trống, đã biết Đã gửi dưới dạng trống
0 Số 0 Không liên quan đến văn bản nhưng thực tế về số lượng

Sự khác biệt đặc biệt quan trọng đối với số lượng. Tiền thưởng bằng 0 có nghĩa là người đó không nhận được gì. Phần thưởng NULL có nghĩa là chưa có ai biết.

Bảng mẫu

CREATE TABLE employees (
  id INT, name TEXT, phone TEXT, bonus INT, manager_id INT
);

INSERT INTO employees VALUES
 (1,'Meera','555-0101',500,NULL),
 (2,'Arjun',NULL,300,1),
 (3,'Sara','',NULL,1),
 (4,'Ravi',NULL,NULL,2);

Lưu ý rằng Sara có một chuỗi trống cho điện thoại, trong khi Arjun và Ravi có NULL. Hai người được đối xử rất khác nhau.

Kiểm tra NULL

Đây là lỗi mà hầu hết mọi người đều mắc phải lúc đầu:

SELECT name FROM employees WHERE phone = NULL;
-- (no rows)

SELECT name FROM employees WHERE phone IS NULL;
-- Arjun
-- Ravi

SELECT name FROM employees WHERE phone IS NOT NULL;
-- Meera
-- Sara

Truy vấn đầu tiên là SQL hợp lệ và không có lỗi. Đơn giản là nó không trả về gì cả, bởi vì so sánh bất cứ thứ gì với NULL là không bao giờ đúng. Sara xuất hiện dưới IS NOT NULL, vì chuỗi trống là giá trị thực. Tuy nhiên, trong Oracle, một chuỗi trống được coi là NULL, đây là một ngoại lệ đáng chú ý.

Logic ba giá trị

Trong hầu hết các ngôn ngữ lập trình, điều kiện là đúng hoặc sai. SQL thêm kết quả thứ ba: không xác định. Nếu bạn không biết một giá trị, bạn không thể nói liệu nó có bằng 5 hay không. Và hai giá trị chưa biết không được coi là bằng nhau, đó là lý do tại sao NULL = NULL không đúng. Trong thử nghiệm của chúng tôi, tất cả những thứ này đều trả về NULL:

SELECT NULL = NULL, NULL <> 1, 1 + NULL, 'a' || NULL;

-- NULL | NULL | NULL | NULL

Điều kiện kết hợp tuân theo các quy tắc cẩn thận. Đây là kết quả từ lần chạy của chúng tôi, trong đó 1 là đúng và 0 là sai:

Biểu thức kết quả tại sao
ĐÚNG VÀ KHÔNG CÓ KHÔNG CÓ Phụ thuộc vào phần chưa biết
SAI VÀ KHÔNG sai Sai bất kể điều chưa biết là gì
ĐÚNG HOẶC KHÔNG đúng Đúng dù điều chưa biết là gì
FALSE HOẶC NULL KHÔNG CÓ Phụ thuộc vào phần chưa biết
KHÔNG NULL KHÔNG CÓ Đối diện của cái chưa biết là cái chưa biết

Các hàng biến mất khỏi WHERE

WHERE chỉ giữ một hàng nếu điều kiện của nó là true. Các hàng có kết quả không xác định sẽ bị loại bỏ, cùng với những hàng sai. Điều này dẫn đến kết quả đáng ngạc nhiên:

SELECT name FROM employees WHERE phone <> '555-0101';

-- Sara

Bạn có thể mong đợi Arjun và Ravi sẽ xuất hiện vì số điện thoại của họ chắc chắn không phải là số đó. Nhưng điện thoại của họ không rõ nên kết quả không xác định và họ biến mất. Để bao gồm chúng, hãy nói rõ ràng: WHERE phone <> '555-0101' OR phone IS NULL. Phủ định cũng không giúp được gì:

SELECT name FROM employees WHERE NOT (bonus > 400);

-- Arjun

Sara và Ravi không có phần thưởng nên họ không xuất hiện trong bonus > 400 cũng như không xuất hiện trong phần đối lập. Đây là điều quan trọng cần nhớ: một điều kiện và sự phủ định của nó không phải lúc nào cũng bao gồm mọi hàng.

COALESCE: cung cấp một phương án dự phòng

COALESCE trả về giá trị không NULL đầu tiên trong danh sách của nó và nó hoạt động trên tất cả các cơ sở dữ liệu chính:

SELECT COALESCE(NULL, NULL, 'third', 'fourth');
-- third

SELECT name, COALESCE(phone, 'no phone') FROM employees;
-- Meera | 555-0101
-- Arjun | no phone
-- Sara  |
-- Ravi  | no phone

Sara vẫn hiển thị trống vì chuỗi trống không phải là NULL. Các hàm tương tự tồn tại, chẳng hạn như IFNULL trong MySQL và SQLite, ISNULL trong SQL Server và NVL trong Oracle. COALESCE là sự lựa chọn di động. Quan điểm trước đây của chúng tôi về tính toán cũng được áp dụng ở đây. bonus + 100 cung cấp NULL cho bất kỳ ai không có tiền thưởng, vì vậy hãy viết COALESCE(bonus, 0) + 100 nếu coi khoản tiền thưởng bị thiếu là 0 là đúng cho doanh nghiệp của bạn.

NULLIF: biến một giá trị thành NULL

NULLIF(a, b) trả về NULL nếu hai giá trị bằng nhau và nếu không thì trả về a. Hai công dụng đặc biệt hữu ích. Nó có thể dọn sạch các giá trị giữ chỗ:

SELECT name, NULLIF(phone, '') FROM employees WHERE id = 3;
-- Sara | NULL

SELECT name FROM employees
WHERE COALESCE(NULLIF(phone, ''), '') = '';
-- Arjun
-- Sara
-- Ravi

Truy vấn thứ hai đó là một cách thuận tiện để tìm các giá trị “thiếu hoặc trống”. Nó cũng có thể ngăn chặn việc chia cho 0, điều này gây ra lỗi trong nhiều cơ sở dữ liệu:

SELECT total / NULLIF(quantity, 0) FROM sales;

Khi quantity bằng 0, điều này mang lại giá trị NULL thay vì thất bại. Trong thử nghiệm của chúng tôi, SELECT 100 / NULLIF(0, 0) trả về NULL.

Tổng hợp bỏ qua NULL

Đây là nơi NULL gây thiệt hại nhiều nhất cho các báo cáo:

SELECT COUNT(*), COUNT(bonus), SUM(bonus), AVG(bonus),
       AVG(COALESCE(bonus, 0))
FROM employees;

-- 4 | 2 | 800 | 400.0 | 200.0
Biểu thức kết quả Nó có nghĩa là gì
COUNT(*) 4 Tất cả các hàng
COUNT(bonus) 2 Chỉ những hàng có tiền thưởng
SUM(bonus) 800 NULL bị bỏ qua
AVG(bonus) 400 800 chia cho 2 chứ không phải chia cho 4
AVG(HỢP NHẤT(thưởng, 0)) 200 800 chia cho 4

Vậy tiền thưởng trung bình là bao nhiêu, 400 hay 200? Nó phụ thuộc vào ý nghĩa của NULL trong dữ liệu của bạn. Nếu NULL có nghĩa là “không trả tiền thưởng”, thì 200 là đúng. Nếu nó có nghĩa là “chưa quyết định” thì 400 có thể đúng. Cơ sở dữ liệu không thể đưa ra quyết định này cho bạn, vì vậy câu hỏi phải được gửi đến người biết về doanh nghiệp.

Một cái bẫy liên quan: SUM không có giá trị nào là NULL thay vì 0. Khi chúng tôi chỉ tính tổng các hàng không có phần thưởng, chúng tôi nhận được NULL, trong khi COUNT trả về 0. Mã ứng dụng mong đợi một số có thể gặp sự cố với điều này, vì vậy hãy gói nó lại: COALESCE(SUM(bonus), 0).

Mẹo: Khi tổng số báo cáo không hiển thị, hãy so sánh COUNT(*) với COUNT(column). Bất kỳ khoảng cách nào giữa chúng sẽ cho bạn biết ngay cột đó có bao nhiêu NULL.

NHÓM THEO, sắp xếp và KHÁC BIỆT

Mặc dù các NULL “không bằng” khi so sánh, nhưng các thao tác này coi chúng là một nhóm:

SELECT bonus, COUNT(*) FROM employees GROUP BY bonus ORDER BY bonus;
-- NULL | 2
--  300 | 1
--  500 | 1

SELECT DISTINCT bonus FROM employees;
-- 500, 300, NULL

Xem SQL GROUP BY và HAVING để biết thêm về cách nhóm. Thứ tự sắp xếp là nơi cơ sở dữ liệu thực sự khác nhau. SQLite và MySQL coi NULL là giá trị nhỏ nhất, trong khi PostgreSQL và Oracle coi nó là giá trị lớn nhất. Vì vậy, ORDER BY bonus DESC tương tự có thể đặt NULL cuối cùng trong cái này và đầu tiên trong cái khác. PostgreSQL, Oracle và SQLite hiện đại cho phép bạn nêu điều này một cách trực tiếp bằng cách sử dụng NULLS FIRST hoặc NULLS LAST.

Tham gia

Điều kiện nối sử dụng = không bao giờ khớp với NULL, vì vậy các hàng có khóa NULL sẽ bị loại khỏi phép nối bên trong:

SELECT e.name FROM employees e
JOIN employees m ON m.id = e.manager_id;
-- Arjun, Sara, Ravi    (Meera is gone)

SELECT e.name, m.name FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
-- Meera | NULL
-- Arjun | Meera
-- Sara  | Meera
-- Ravi  | Arjun

Meera không có người quản lý, do đó, một kết nối bên trong sẽ âm thầm loại bỏ hàng đó. A LEFT JOIN giữ nó và nó cũng tạo ra các NULL của riêng nó cho bên bị thiếu. Đọc thêm trong Giải thích về các phép nối SQL.

Bẫy KHÔNG VÀO

Một NULL duy nhất trong danh sách NOT IN sẽ xóa sạch mọi kết quả:

SELECT name FROM employees WHERE manager_id NOT IN (1);
-- Ravi

SELECT name FROM employees WHERE manager_id NOT IN (1, NULL);
-- (no rows)

Dạng thứ hai có nghĩa là manager_id <> 1 AND manager_id <> NULL và phần cuối cùng đó không bao giờ có thể đúng. Điều này đặc biệt nguy hiểm với các truy vấn phụ, trong đó NULL có thể đến mà không được chú ý. Thay vào đó, hãy sử dụng NOT EXISTS, như được giải thích trong Hướng dẫn về truy vấn con SQL của chúng tôi. Meera cũng bị thiếu trong kết quả đầu tiên, vì manager_id của hàng đó là NULL.

Thiết kế với NULL

  • Sử dụng NOT NULL theo mặc định. Chỉ cho phép NULL khi một giá trị thực sự có thể bị thiếu.
  • Thêm các giá trị mặc định hợp lý. Ví dụ: quantity INT NOT NULL DEFAULT 0.
  • Không sử dụng các giá trị ma thuật. Ngày 1900-01-01 hoặc độ tuổi -1 thay thế cho “không xác định” sẽ làm hỏng tính toán của bạn.
  • Biết hành vi ĐỘC ĐÁO. Hầu hết các cơ sở dữ liệu cho phép một số giá trị NULL trong một cột UNIQUE và thử nghiệm của chúng tôi đã chèn hai giá trị không có lỗi. SQL Server là một ngoại lệ, vì nó thường cho phép một ngoại lệ.
  • Hãy nhớ rằng khóa chính không thể là NULL. Xem khóa chính và khóa ngoại.
  • Thử nghiệm với NULL. Dữ liệu thử nghiệm không có NULL sẽ che giấu những lỗi này. Hãy cố ý đưa chúng vào, giống như cách bạn làm với các trường hợp đặc biệt khác.

Lời kết

Hãy coi NULL là “không xác định” và hầu hết hành vi của nó bắt đầu có ý nghĩa: không xác định cộng với một là không xác định và không xác định bằng không xác định là không được biết là đúng. Kiểm tra một trong các báo cáo của riêng bạn trong tuần này. Kiểm tra các cột có thể rỗng bằng cách sử dụng COUNT(*) so với COUNT(column), tìm bất kỳ NOT IN nào và quyết định ý nghĩa của NULL trong mỗi mức trung bình.

Câu hỏi thường gặp

NULL trong SQL là gì?

NULL là điểm đánh dấu cho giá trị bị thiếu hoặc không xác định. Nó khác với 0 và khác với một chuỗi rỗng và nó cần được xử lý đặc biệt khi so sánh.

Tại sao = NULL không hoạt động?

So sánh bất kỳ thứ gì với NULL cho kết quả không xác định thay vì đúng, vì vậy WHERE sẽ loại bỏ hàng. Sử dụng IS NULL hoặc IS NOT NULL để kiểm tra nó.

Sự khác biệt giữa COALESCE và ISNULL là gì?

COALESCE là SQL tiêu chuẩn và chấp nhận nhiều đối số. ISNULL dành riêng cho SQL Server và có hai. Đối với mã di động, hãy ưu tiên COALESCE.

COUNT có bao gồm các giá trị NULL không?

COUNT(*) đếm tất cả các hàng, kể cả những hàng có giá trị NULL. COUNT(cột) chỉ đếm các hàng trong đó cột đó không phải là NULL, có thể cho số nhỏ hơn.

NULL có giống như một chuỗi rỗng không?

Không, trong hầu hết các cơ sở dữ liệu. Chuỗi trống là giá trị đã biết không có ký tự và NULL có nghĩa là không xác định. Oracle là một ngoại lệ đáng chú ý vì nó coi các chuỗi trống là NULL.

Tiếp tục học hỏi

Làm việc với Stack Quora

Cần trợ giúp về kiểm tra, WordPress hoặc SEO?

Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.

Trí tuệ nhân tạo

Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó

Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …

Đọc bài viết →
DevOps

Giải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng

Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…

Đọc bài viết →
Phát triển phần mềm

Giải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429

Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …

Đọc bài viết →
Tự động hóa kiểm thử

Chế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối

Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…

Đọc bài viết →
Kiểm thử phần mềm

Giải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%

Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

DELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại

DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ

Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…

Đọc bài viết →
Phát triển phần mềm

Giao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch

Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …

Đọc bài viết →
Phát triển phần mềm

Giải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng

Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…

Đọc bài viết →
Phát triển phần mềm

Hàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng

Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …

Đọc bài viết →
Trí tuệ nhân tạo

Đại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy

Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …

Đọc bài viết →
DevOps

Giám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết

Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…

Đọc bài viết →
DevOps

Docker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách

Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …

Đọc bài viết →
Tự động hóa kiểm thử

TDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each

TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế

Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Câu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp

TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…

Đọc bài viết →
Phát triển phần mềm

JWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động

JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…

Đọc bài viết →
Phát triển phần mềm

Giải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ

Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…

Đọc bài viết →
Phát triển phần mềm

Giải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế

Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …

Đọc bài viết →
Trí tuệ nhân tạo

Nhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản

nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…

Đọc bài viết →
DevOps

Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn

Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…

Đọc bài viết →
Tự động hóa kiểm thử

Kiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn

Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6

Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…

Đọc bài viết →
Kiểm thử phần mềm

Trường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp

Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…

Đọc bài viết →
Cơ sở dữ liệu & SQL

SQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra

SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…

Đọc bài viết →
Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…

Đọc bài viết →
Phát triển phần mềm

Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

Các lớp và đối tượng Python được giải thích bằng mã mà chúng tôi đã chạy: __init__, các phương thức, thuộc tính lớp và phiên bản, tính kế thừa, thuộ…

Đọc bài viết →
Trí tuệ nhân tạo

Mô hình ngôn ngữ lớn là gì? LLM hoạt động như thế nào, được giải thích mà không cường điệu hóa

Mô hình ngôn ngữ lớn là gì? LLM được giải thích bằng ngôn ngữ đơn giản: mã thông báo, phần nhúng, sự chú ý, đào tạo, cửa sổ nhiệt độ và ngữ cảnh, mộ…

Đọc bài viết →
DevOps

Các lệnh Linux cho người mới bắt đầu: Hướng dẫn thiết bị đầu cuối cần thiết kèm ví dụ

Các lệnh Linux dành cho người mới bắt đầu, được nhóm theo tác vụ: điều hướng, tệp, xem nhật ký, grep, đường dẫn, quyền, quy trình và lưu trữ, cùng v…

Đọc bài viết →
Tự động hóa kiểm thử

Selenium vs Nhà viết kịch: Sự khác biệt chính, So sánh mã và nên chọn cái nào

Selenium và Playwright được so sánh: kiến trúc, chờ đợi, hỗ trợ trình duyệt và ngôn ngữ, gỡ lỗi, kiểm tra giống nhau ở cả hai công cụ, lời khuyên di…

Đọc bài viết →
Kiểm thử phần mềm

Phân vùng tương đương: Giải thích kỹ thuật thiết kế thử nghiệm bằng các ví dụ đã thực hiện

Giải thích về phân vùng tương đương: cách tìm các phân vùng hợp lệ và không hợp lệ, các ví dụ hoạt động theo độ tuổi, mật khẩu và phiếu giảm giá, cá…

Đọc bài viết →
Kiểm thử phần mềm

Mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: Sự khác biệt, Ma trận và ví dụ thực tế

Giải thích về mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: định nghĩa rõ ràng, ma trận bốn chiều với các ví dụ, thang đo cấp độ, a…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Hướng dẫn về truy vấn con SQL: Các loại, truy vấn con tương quan và TỒN TẠI kèm ví dụ

Hướng dẫn về truy vấn con SQL với các truy vấn chúng tôi đã chạy: truy vấn con vô hướng, IN, FROM và SELECT, truy vấn con tương quan, EXISTS, bẫy và…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về giao dịch SQL và ACID: Các mức CAM KẾT, ROLLBACK và Cô lập

Các giao dịch SQL và ACID được giải thích bằng chuyển khoản ngân hàng mà chúng tôi đã thực hiện: CAM KẾT, ROLLBACK, điểm lưu trữ, khóa, mức cách ly,…

Đọc bài viết →
Phát triển phần mềm

Git merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào

Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.

Đọc bài viết →
Phát triển phần mềm

List comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh

List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.

Đọc bài viết →