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

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

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

Sự khác biệt giữa chúng chỉ là một từ, nhưng việc chọn sai có thể âm thầm đưa ra kết quả sai cho bạn. Xem cả hai trên dữ liệu thực, tìm hiểu các quy tắc chung của chúng và đọc điều gì đã xảy ra khi chúng tôi tính giờ cho chúng trên một triệu hàng.

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

Điểm chính

  • UNION kết hợp các kết quả và xóa các hàng trùng lặp. UNION ALL giữ mọi hàng.
  • Việc loại bỏ chi phí trùng lặp có tác dụng nên UNION ALL thường được tính toán nhanh hơn.
  • Sử dụng UNION trước SUM có thể âm thầm loại bỏ các giá trị thực và đưa ra câu trả lời sai.
  • Mặc định là UNION ALL, trừ khi bạn đặc biệt muốn xóa các bản sao.

Cả hai toán tử đều xếp chồng kết quả của hai truy vấn lên nhau, vì vậy SQL UNION so với UNION ALL có thể giống như một lựa chọn nhỏ. Không phải vậy. Một từ bổ sung sẽ thay đổi cả kết quả của bạn và mức độ hoạt động của cơ sở dữ liệu.

Chúng tôi đã chạy mọi truy vấn ở đây bằng SQLite 3.50 và kết quả cũng như thời gian hiển thị đều đến từ những lần chạy đó. Hành vi cơ bản là SQL tiêu chuẩn trên các cơ sở dữ liệu chính. Tuy nhiên, thời gian sẽ khác nhau tùy theo cơ sở dữ liệu, dữ liệu và phần cứng của riêng bạn, vì vậy hãy coi thời gian của chúng tôi là minh họa.

Câu trả lời ngắn gọn

UNION kết hợp hai tập hợp kết quả và chỉ trả về các hàng riêng biệt. UNION ALL kết hợp chúng và trả về mọi thứ, kể cả các bản sao. Đó là toàn bộ sự khác biệt và phần còn lại của bài viết này là về lý do tại sao nó lại quan trọng.

UNION vs UNION ALL cạnh nhau

Khía cạnh ĐOÀN ĐOÀN TẤT CẢ
Hàng trùng lặp Đã xóa giữ
Công việc làm thêm Phải tìm bản sao không có
Tốc độ thông thường Chậm hơn Nhanh hơn
Hàng được trả về Giống hoặc ít hơn Tất cả bọn họ
An toàn trước SUM hoặc COUNT? Thường thì không Có
Tốt nhất cho Danh sách duy nhất Hợp nhất dữ liệu, nhật ký, tổng số

Dữ liệu mẫu

Hãy tưởng tượng một cửa hàng lưu giữ các đơn đặt hàng trực tuyến và tại cửa hàng trong các bảng riêng biệt. Lưu ý rằng Asha có hai đơn hàng trực tuyến giống hệt nhau và một đơn hàng giống hệt nhau tại cửa hàng.

CREATE TABLE online_orders (customer TEXT, total INT);
CREATE TABLE store_orders (customer TEXT, total INT);

INSERT INTO online_orders VALUES ('Asha',100), ('Ben',200), ('Asha',100);
INSERT INTO store_orders VALUES ('Asha',100), ('Dev',300);

Xem sự khác biệt

SELECT customer, total FROM online_orders
UNION
SELECT customer, total FROM store_orders;

-- Asha | 100
-- Ben  | 200
-- Dev  | 300
SELECT customer, total FROM online_orders
UNION ALL
SELECT customer, total FROM store_orders;

-- Asha | 100
-- Ben  | 200
-- Asha | 100
-- Asha | 100
-- Dev  | 300

Năm hàng đầu vào trở thành ba hàng có UNION và cả năm hàng vẫn giữ nguyên UNION ALL. Hai điều cần chú ý:

  • UNION đã xóa các kết quả trùng lặp khỏi toàn bộ kết quả, bao gồm cả những kết quả trong bảng đầu tiên. Nó không chỉ so sánh giữa các bảng.
  • Một hàng chỉ được tính là trùng lặp khi mọi cột đã chọn khớp.

Khi bạn thực sự muốn có một danh sách riêng biệt, UNION hoàn toàn chính xác. Điều này mang lại cho mọi khách hàng đã mua qua một trong hai kênh:

SELECT customer FROM online_orders
UNION
SELECT customer FROM store_orders;

-- Asha
-- Ben
-- Dev

Lỗi tổng thể sai

Đây là lý do tại sao sự lựa chọn thực sự quan trọng. Giả sử bạn muốn tổng doanh thu. Các đơn hàng trên cộng lại lên tới 800. Hãy xem mỗi nhà điều hành đưa ra những gì:

SELECT SUM(total) FROM (
  SELECT total FROM online_orders
  UNION
  SELECT total FROM store_orders
);
-- 600

SELECT SUM(total) FROM (
  SELECT total FROM online_orders
  UNION ALL
  SELECT total FROM store_orders
);
-- 800

Phiên bản UNION sai 200. Vì chúng tôi chỉ chọn cột total nên ba đơn hàng 100 rupee riêng biệt trông giống như hai bản sao và bị thu gọn thành một. Không có thông báo lỗi và 600 có vẻ là một con số hoàn toàn có thể tin được. Loại lỗi thầm lặng này có thể tồn tại trong báo cáo tài chính trong nhiều tháng.

Mẹo: Hai hàng trông giống hệt nhau có thể là hai sự kiện thực sự. Trước khi bạn sử dụng UNION, hãy hỏi xem các hàng giống nhau có nghĩa là cùng một dữ kiện được ghi hai lần hay hai dữ kiện khác nhau. Đối với các mục bán hàng, thanh toán và nhật ký, nó thường là mục thứ hai.

Quy tắc cả hai phải tuân theo

Cả hai nhà khai thác đều có cùng yêu cầu:

  1. Mỗi SELECT phải trả về cùng số cột.
  2. Các cột được khớp theo vị trí chứ không phải theo tên, vì vậy hãy giữ chúng theo cùng thứ tự.
  3. Loại dữ liệu ở mỗi vị trí phải tương thích.
  4. Tên cột kết quả đến từ đầu tiên SELECT.
  5. ORDER BY nằm ở cuối và áp dụng cho toàn bộ kết quả.

Phá vỡ quy tắc đầu tiên sẽ gây ra lỗi. Đây là thông báo từ SQLite:

SELECT customer, total FROM online_orders
UNION
SELECT customer FROM store_orders;

-- SELECTs to the left and right of UNION do not have
-- the same number of result columns

Quy tắc thứ hai nguy hiểm hơn vì nó có thể thất bại mà không có lỗi. Nếu bạn hoán đổi hai cột cùng loại, chẳng hạn như first_name và last_name, truy vấn sẽ chạy và dữ liệu sẽ hiển thị sai. SQLite cũng thoải mái về các loại, trong khi các cơ sở dữ liệu như PostgreSQL chặt chẽ hơn và có thể yêu cầu một cách rõ ràng CAST.

Dán nhãn nguồn

Một thủ thuật rất thực tế là thêm một cột cố định cho biết mỗi hàng đến từ đâu. Vì nhãn khác nhau nên các hàng từ các bảng khác nhau không thể được coi là trùng lặp với nhau nữa.

SELECT customer, total, 'online' AS channel FROM online_orders
UNION ALL
SELECT customer, total, 'store' FROM store_orders
ORDER BY customer, channel;

-- Asha | 100 | online
-- Asha | 100 | online
-- Asha | 100 | store
-- Ben  | 200 | online
-- Dev  | 300 | store

Sau khi dữ liệu của bạn có nhãn, bạn có thể nhóm dữ liệu đó để báo cáo doanh số bán hàng theo kênh bằng cách sử dụng GROUP BY. Nếu bạn cần kết hợp nhiều bước, hãy gói phần kết hợp trong CTE để giữ cho nó có thể đọc được.

Hiệu suất: điều gì đã xảy ra trong thử nghiệm của chúng tôi

Để loại bỏ các bản sao, cơ sở dữ liệu phải so sánh các hàng, thường bằng cách sắp xếp hoặc băm chúng. UNION ALL có thể bỏ qua bước này. Chúng tôi đã tạo hai bảng, mỗi bảng có 500.000 hàng, chứa các số ngẫu nhiên từ 0 đến 50.000, do đó có rất nhiều bản sao. Chúng tôi đã chạy từng truy vấn nhiều lần và giữ được thời gian tốt nhất.

Đầu tiên, chúng tôi đếm kết quả để thời gian gửi hàng trở lại chương trình của chúng tôi không ảnh hưởng đến việc so sánh:

Truy vấn, được gói trong COUNT(*) Hàng Thời gian tốt nhất
ĐOÀN 50,001 261 mili giây
ĐOÀN TẤT CẢ 1,000,000 Dưới 1 mili giây

Khoảng cách lớn một phần là do SQLite có thể tính toán số lượng đó mà không cần đọc từng hàng, vì vậy vui lòng không đọc nó là “nhanh hơn hàng nghìn lần”. Tuy nhiên, nó thể hiện ý tưởng cốt lõi: UNION phải làm công việc thực tế còn UNION ALL thì không.

Sau đó, chúng tôi tìm nạp tất cả các hàng vào Python và kết quả như sau:

Truy vấn, tìm nạp tất cả các hàng Hàng được trả về Thời gian tốt nhất
ĐOÀN 50,001 277 mili giây
ĐOÀN TẤT CẢ 1,000,000 392 mili giây

Ở đây, UNION ALL mất nhiều thời gian hơn vì nó phân phối số hàng gấp 20 lần. Sự trùng lặp không phải là nguyên nhân làm chậm nó. Xử lý một triệu hàng là. Vì vậy, quy tắc trung thực là UNION ALL sẽ rẻ hơn để tính toán cơ sở dữ liệu, nhưng kích thước của kết quả cũng quan trọng. Nhiều biểu đồ trực tuyến giảm điều này thành “UNION ALL luôn nhanh hơn” và thử nghiệm của chúng tôi cho thấy lý do tại sao nó không đơn giản như vậy.

Đừng chọn chỉ dựa trên tốc độ. Chọn toán tử đưa ra câu trả lời đúng trước, sau đó điều chỉnh. Nếu truy vấn chậm, hãy đọc hướng dẫn của chúng tôi về Tối ưu hóa truy vấn SQL.

Khi nào nên sử dụng mỗi

Sử dụng UNION ALL khi:

  • Bạn đang hợp nhất dữ liệu từ các bảng tương tự, chẳng hạn như phân vùng hàng tháng.
  • Bạn sẽ tính tổng hoặc đếm sau đó.
  • Bạn biết đầu vào không thể chồng lên nhau.
  • Các bản sao có ý nghĩa, như trong nhật ký hoặc hồ sơ kiểm toán.

Sử dụng UNION khi:

  • Bạn cần một danh sách duy nhất, chẳng hạn như mọi địa chỉ email trên hai hệ thống.
  • Các nguồn chồng chéo chứa cùng một thông tin nhiều lần.

Hãy coi UNION ALL là mặc định và sử dụng UNION một cách có chủ ý. Việc thêm mệnh đề WHERE vào mỗi nhánh để lọc sớm sẽ giúp ích cho cả hai.

GIAO NHẬN VÀ NGOẠI TRỪ

Hai toán tử tập hợp có liên quan trả lời các câu hỏi khác nhau. Cả hai đều tuân theo các quy tắc cột giống nhau:

SELECT customer FROM online_orders
INTERSECT
SELECT customer FROM store_orders;
-- Asha  (bought in both channels)

SELECT customer FROM online_orders
EXCEPT
SELECT customer FROM store_orders;
-- Ben   (online only)

Theo truyền thống, Oracle sử dụng MINUS thay vì EXCEPT và việc hỗ trợ các toán tử này thay đổi một chút tùy theo cơ sở dữ liệu và phiên bản.

ĐOÀN vs THAM GIA

Chúng thường bị nhầm lẫn nhưng chúng kết hợp dữ liệu theo các hướng khác nhau:

hoạt động Hướng kết quả
ĐOÀN Dọc Thêm nhiều hàng hơn
THAM GIA ngang Thêm nhiều cột hơn

Những lỗi thường gặp

  • Sử dụng UNION theo thói quen. Việc này có thể khiến bạn mất tốc độ hoặc xóa các hàng hợp lệ.
  • Chọn quá ít cột. Việc bỏ ID sẽ khiến các hàng riêng biệt trông giống hệt nhau.
  • Thứ tự cột không khớp. Các giá trị có thể nằm sai cột mà không có bất kỳ lỗi nào.
  • Thêm ORDER BY vào mỗi nhánh. Sắp xếp một lần vào cuối.
  • Sử dụng UNION để vá một liên kết xấu. Nếu các bản sao xuất hiện do một liên kết, hãy sửa liên kết đó.
  • Giả sử thứ tự kết quả. Nếu không có ORDER BY, thứ tự hàng không được đảm bảo cho cả hai toán tử.

Lời kết

Mỗi lần hỏi một câu: các hàng giống hệt nhau là cùng một sự kiện hay các sự kiện riêng biệt? Nếu chúng tách biệt hoặc không thể chồng lên nhau, hãy sử dụng UNION ALL. Nếu bạn cần một danh sách duy nhất, hãy sử dụng UNION. Để kiểm tra các báo cáo của riêng bạn, hãy tìm kiếm mã UNION gần SUM hoặc COUNT và xác nhận rằng những tổng số đó thực sự đúng.

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

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

UNION kết hợp hai tập hợp kết quả và loại bỏ các hàng trùng lặp. UNION ALL kết hợp chúng và giữ mọi hàng, kể cả các hàng trùng lặp.

Cái nào nhanh hơn, UNION hay UNION ALL?

UNION ALL thường rẻ hơn khi tính toán vì nó không kiểm tra các bản sao. Việc trả về một kết quả lớn hơn nhiều vẫn có thể mất nhiều thời gian hơn về tổng thể, như thử nghiệm của chúng tôi đã cho thấy.

UNION có loại bỏ các bản sao trong một bảng không?

Đúng. Nó loại bỏ các bản sao trên toàn bộ kết quả tổng hợp, bao gồm các hàng giống hệt nhau đến từ cùng một bảng.

Tên cột có phải khớp trong UNION không?

Không. Các cột được khớp theo vị trí và kết quả sử dụng tên từ CHỌN đầu tiên. Số lượng cột phải khớp và các loại phải tương thích.

Tôi có thể sử dụng ORDER BY với UNION không?

Có, nhưng hãy đặt một ORDER BY ở cuối câu lệnh. Nó sắp xếp toàn bộ kết quả kết hợp chứ không phải một nhánh duy nhất.

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 →