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.
UNIONkết hợp các kết quả và xóa các hàng trùng lặp.UNION ALLgiữ mọi hàng.- Việc loại bỏ chi phí trùng lặp có tác dụng nên
UNION ALLthường được tính toán nhanh hơn. - Sử dụng
UNIONtrướcSUMcó 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:
- Mỗi
SELECTphải trả về cùng số cột. - 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ự.
- Loại dữ liệu ở mỗi vị trí phải tương thích.
- Tên cột kết quả đến từ đầu tiên
SELECT. ORDER BYnằ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
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.
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.
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 →DevOpsGiả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ềmGiả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ềmGiả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 & SQLDELETE 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 & SQLGiả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ềmGiao 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ềmGiả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ềmHà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 →DevOpsGiá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 →DevOpsDocker 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ềmKiể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 & SQLGiả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 & SQLCâ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ềmJWT 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ềmGiả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ềmGiả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ạoNhú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 →DevOpsTriể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ềmKiể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ềmTrườ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 & SQLTố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 & SQLSQL 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ềmHướ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ềmXử 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ềmCá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ạoMô 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 →DevOpsCá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 →Phát triển phần mềmGit 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ềmList 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 & SQLGiả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 →