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ụ

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

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ụ

Truy vấn con là một truy vấn bên trong một truy vấn khác. Tìm hiểu từng loại và vị trí phù hợp, hiểu chính xác các truy vấn con tương quan và tránh bẫy NOT IN âm thầm không trả về hàng nào cả.

Đọc 9 phút
Hướng dẫn về truy vấn con SQL: các loại, truy vấn con tương quan và EXISTS cùng với các ví dụ

Điểm chính

  • Truy vấn con là một truy vấn được lồng bên trong một truy vấn khác và truy vấn bên ngoài sử dụng kết quả của truy vấn đó.
  • Truy vấn con có thể xuất hiện trong WHERE, FROM, SELECT và HAVING.
  • Truy vấn con tương quan đề cập đến hàng bên ngoài, do đó, nó được đánh giá một cách hợp lý trên mỗi hàng.
  • Thích NOT EXISTS hơn NOT IN khi có thể có NULL.

Một số câu hỏi thực hiện hai bước để trả lời. “Đơn hàng nào trên mức trung bình?” yêu cầu bạn phải tìm mức trung bình trước, sau đó so sánh từng đơn hàng với nó. Truy vấn con SQL cho phép bạn viết cả hai bước dưới dạng một câu lệnh.

Hướng dẫn này đề cập đến từng loại bằng cách sử dụng hai bảng nhỏ. Chúng tôi đã chạy các truy vấn này trong SQLite 3.50 và kết quả hiển thị là từ lần chạy đó. Cú pháp truy vấn con tiêu chuẩn được hỗ trợ rộng rãi và chúng tôi chỉ ra những điểm khác nhau của cơ sở dữ liệu.

Truy vấn phụ là gì?

Truy vấn con, còn được gọi là truy vấn bên trong hoặc truy vấn lồng nhau, là câu lệnh SELECT được đặt bên trong câu lệnh khác, trong dấu ngoặc tròn. Về mặt khái niệm, truy vấn bên trong tạo ra kết quả mà truy vấn bên ngoài sẽ sử dụng.

SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);

Các bảng mẫu

CREATE TABLE customers (id INT, name TEXT, city TEXT);
CREATE TABLE orders (id INT, customer_id INT, total INT);

INSERT INTO customers VALUES
 (1,'Asha','Pune'), (2,'Ben','Delhi'), (3,'Chitra','Pune'), (4,'Dev','Goa');

INSERT INTO orders VALUES
 (101,1,1200), (102,1,800), (103,2,300), (104,3,2500), (105,3,100);

Lưu ý rằng Dev không có đơn đặt hàng. Chi tiết đó quan trọng đối với một số ví dụ dưới đây.

Sơ lược về các loại truy vấn con

Loại Trả lại Vị trí điển hình Toán tử phổ biến
vô hướng Một giá trị WHERE, SELECT =, >, <
Nhiều hàng Một cột, nhiều hàng Ở ĐÂU IN, ANY, ALL
Bảng (có nguồn gốc) Nhiều cột và hàng TỪ Dùng như một cái bàn
Tương quan Phụ thuộc vào hàng bên ngoài WHERE, SELECT Bất kỳ, và EXISTS

Truy vấn con vô hướng

Truy vấn con vô hướng trả về chính xác một giá trị, vì vậy bạn có thể sử dụng nó ở bất cứ nơi nào có một giá trị hợp lý. Đây là truy vấn từ trước đó, cùng với kết quả của nó. Trung bình của tất cả các đơn đặt hàng là 980:

SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);

-- 101 | 1200
-- 104 | 2500

Bạn không thể viết WHERE total > AVG(total) vì các tổng hợp không được phép trực tiếp trong WHERE. Truy vấn con giải quyết vấn đề này bằng cách tính toán giá trị riêng biệt.

Điều gì sẽ xảy ra nếu truy vấn con “vô hướng” trả về một số hàng? Hầu hết các cơ sở dữ liệu, bao gồm PostgreSQL, MySQL và SQL Server, đều phát sinh lỗi. SQLite thì không. Trong thử nghiệm của chúng tôi, nó chỉ âm thầm sử dụng hàng đầu tiên, hàng này có thể ẩn một lỗi thực sự, vì vậy đừng phụ thuộc vào hành vi này.

TRONG và KHÔNG TRONG

Khi truy vấn bên trong trả về một danh sách, hãy sử dụng IN. Điều này tìm thấy khách hàng có ít nhất một đơn hàng trên 1000:

SELECT name FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);

-- Asha
-- Chitra

NOT IN làm ngược lại, tìm khách hàng chưa từng đặt hàng:

SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);

-- Dev

Điều đó có hiệu quả ở đây, nhưng NOT IN có một trường hợp nguy hiểm mà chúng tôi sẽ đề cập bên dưới.

Truy vấn con trong TỪ

Truy vấn con trong FROM hoạt động như một bảng tạm thời, thường được gọi là bảng dẫn xuất. Tính năng này rất hữu ích khi bạn cần tổng hợp hai lần, như trong truy vấn này về mức chi tiêu trung bình cho mỗi khách hàng ở mỗi thành phố:

SELECT city, AVG(spent) AS avg_spent
FROM (
  SELECT c.city, SUM(o.total) AS spent
  FROM customers c
  JOIN orders o ON o.customer_id = c.id
  GROUP BY c.id, c.city
) AS per_customer
GROUP BY city;

-- Delhi |  300.0
-- Pune  | 2300.0

Truy vấn bên trong tính tổng từng khách hàng và truy vấn bên ngoài tính trung bình các tổng đó. Đặt bí danh cho bảng dẫn xuất là một thói quen tốt vì một số cơ sở dữ liệu yêu cầu điều đó. Nếu GROUP BY là mới đối với bạn, hãy xem SQL GROUP BY và HAVING.

Truy vấn con trong CHỌN

Truy vấn con vô hướng cũng có thể thêm cột được tính toán. Cái này tính số đơn đặt hàng cho mỗi khách hàng:

SELECT name,
       (SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id) AS order_count
FROM customers c;

-- Asha   | 2
-- Ben    | 1
-- Chitra | 2
-- Dev    | 0

Dev xuất hiện với con số 0. Phép nối bên trong sẽ loại bỏ hoàn toàn Dev vì Dev không có hàng phù hợp. Bạn có thể nhận được kết quả tương tự với LEFT JOIN và GROUP BY mà chúng tôi giải thích trong Giải thích về các phép nối SQL.

Truy vấn con tương quan

Ví dụ trước cũng có mối tương quan vì truy vấn bên trong đề cập đến c.id từ truy vấn bên ngoài. Truy vấn con không tương quan có thể chạy một mình. Không thể có mối tương quan vì nó phụ thuộc vào giá trị từ hàng ngoài hiện tại.

Điều này tìm thấy các đơn đặt hàng trên mức trung bình của chính khách hàng đó:

SELECT o.id, o.customer_id, o.total
FROM orders o
WHERE o.total > (
  SELECT AVG(i.total)
  FROM orders i
  WHERE i.customer_id = o.customer_id
);

-- 101 | 1 | 1200
-- 104 | 3 | 2500

Đây là cách đọc nó. Đối với đơn hàng 101, truy vấn bên trong tính trung bình các đơn hàng của khách hàng 1 (1200 và 800), kết quả là 1000. Vì 1200 lớn hơn nên hàng được giữ nguyên. Đối với lệnh 102, áp dụng mức trung bình tương tự, nhưng 800 không lớn hơn nên bị loại bỏ. Đơn hàng của khách hàng 2 bằng mức trung bình của chính khách hàng đó nên đơn hàng đó cũng bị loại bỏ.

tính năng Không tương quan Tương quan
Sử dụng các giá trị truy vấn bên ngoài? Không Có
Có thể tự chạy được không? Có Không
Thực thi logic Một lần Một lần cho mỗi hàng ngoài
Rủi ro hiệu suất Thường thấp Có thể cao trên bàn lớn

“Một lần trên mỗi hàng” mô tả logic và trình tối ưu hóa truy vấn thường viết lại những điều này thành thứ gì đó hiệu quả hơn nhiều. Tuy nhiên, một truy vấn con tương quan chậm vẫn đáng để nghiên cứu. Chỉ mục ở cột bên trong, ở đây orders.customer_id, có thể tạo ra sự khác biệt lớn. Xem Giải thích về chỉ mục SQL.

Tồn tại và KHÔNG Tồn tại

EXISTS đặt câu hỏi có hoặc không: truy vấn bên trong có trả về ít nhất một hàng không? Nó có thể dừng lại ở trận đấu đầu tiên, và những gì bạn chọn bên trong không quan trọng, đó là lý do tại sao người ta thường viết SELECT 1.

SELECT c.name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

-- Asha, Ben, Chitra

SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

-- Dev

Bẫy NOT IN NULL

Đây là một trong những lỗi truy vấn con phổ biến nhất. Chúng tôi đã tạo một bảng có một ID thực và một NULL, sau đó chạy cả hai biểu mẫu với nó:

CREATE TABLE r (customer_id INT);
INSERT INTO r VALUES (1), (NULL);

SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM r);
-- (no rows at all)

SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM r WHERE r.customer_id = c.id);
-- Ben, Chitra, Dev

Tại sao lần đầu tiên không trả lại gì? id NOT IN (1, NULL) có nghĩa là id <> 1 AND id <> NULL. Mọi so sánh với NULL đều không xác định chứ không phải đúng, vì vậy toàn bộ điều kiện không bao giờ có thể đúng. Không có thông báo lỗi và không có cảnh báo, chỉ là một kết quả trống có vẻ hợp lý.

Mẹo: Sử dụng NOT EXISTS để chống tham gia theo mặc định. Nếu bạn sử dụng NOT IN, hãy thêm WHERE customer_id IS NOT NULL bên trong truy vấn phụ.

Truy vấn con vs THAM GIA vs CTE

Nhiều truy vấn có thể được viết theo nhiều cách. Trước đó chúng tôi đã tìm thấy những khách hàng có đơn đặt hàng lớn bằng cách sử dụng IN. Đây là kết quả tương tự khi tham gia:

SELECT DISTINCT c.name FROM customers c
JOIN orders o ON o.customer_id = c.id AND o.total > 1000;

-- Asha
-- Chitra

Lưu ý DISTINCT. Một phép nối có thể tạo ra các bản sao nếu khách hàng có nhiều kết quả trùng khớp, trong khi IN và EXISTS thì không thể.

sử dụng Khi nào
THAM GIA Bạn cần các cột từ cả hai bảng
TRONG hoặc TỒN TẠI Bạn chỉ cần lọc xem có kết quả trùng khớp hay không
Bảng dẫn xuất Bạn cần tổng hợp trước và nó vẫn ngắn
CTE Logic có nhiều bước hoặc được sử dụng nhiều lần
Chức năng cửa sổ Bạn cần có hình của mỗi nhóm bên cạnh mỗi hàng

Hiệu suất thay đổi tùy theo cơ sở dữ liệu và dữ liệu, đồng thời các trình tối ưu hóa hiện đại thường tạo ra các kế hoạch tương tự. Vì vậy, trước tiên hãy chọn hình thức rõ ràng nhất, sau đó kiểm tra EXPLAIN nếu nó chạy chậm.

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

  • Sử dụng = với kết quả nhiều hàng. Sử dụng IN hoặc đảm bảo truy vấn bên trong trả về một hàng.
  • Sử dụng NOT IN trên cột có thể rỗng. Bạn có thể âm thầm mất mọi hàng.
  • Sử dụng bí danh không rõ ràng. Trong các truy vấn tương quan, hãy xác định rõ từng cột, nếu không nó có thể liên kết với bảng sai.
  • Lồng nhau sâu. Ba cấp độ khó đọc, vì vậy hãy chuyển đổi chúng thành CTE.
  • Thêm ORDER BY vào bên trong. Nó thường không ảnh hưởng đến kết quả bên ngoài và một số cơ sở dữ liệu từ chối nó.

Lời kết

Truy vấn con là một cách tự nhiên để diễn đạt các câu hỏi hai bước. Bắt đầu với các truy vấn con vô hướng và IN, sau đó thực hành các truy vấn tương quan bằng cách suy luận thông qua một hàng bên ngoài tại một thời điểm. Và hãy nhớ NOT EXISTS bất cứ khi nào có thể có NULL. Để thực hành, hãy viết một câu hỏi theo ba cách, với truy vấn phụ, nối và CTE, rồi so sánh cả kết quả và khả năng đọc.

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

Truy vấn con trong SQL là gì?

Truy vấn con là một câu lệnh CHỌN được lồng bên trong một câu lệnh SQL khác, trong ngoặc đơn. Câu lệnh bên ngoài sử dụng kết quả của nó làm giá trị, danh sách hoặc bảng.

Truy vấn con tương quan là gì?

Đó là truy vấn con tham chiếu đến một cột từ truy vấn bên ngoài. Nó phụ thuộc vào hàng bên ngoài hiện tại nên không thể tự chạy được.

Truy vấn phụ hay THAM GIA cái nào nhanh hơn?

Nó phụ thuộc vào cơ sở dữ liệu và dữ liệu, đồng thời các trình tối ưu hóa thường tạo ra các kế hoạch tương tự. Trước tiên hãy viết phiên bản rõ ràng nhất, sau đó so sánh các kế hoạch thực hiện nếu hiệu suất có vấn đề.

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

IN so sánh một giá trị với danh sách kết quả. EXISTS kiểm tra xem có hàng nào được trả về hay không. Chúng hoạt động khác với NULL khi bị phủ định.

Truy vấn con có thể trả về nhiều cột không?

Có, khi được sử dụng trong FROM làm bảng dẫn xuất và một số cơ sở dữ liệu cũng cho phép so sánh hàng. Truy vấn con vô hướng chỉ được trả về một cột và một hàng.

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 →