0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Khám Phá Sức Mạnh của SQL: Subqueries, CTEs và Stored Procedures

Đăng vào 1 tuần trước

• 4 phút đọc

📝 Giới thiệu

Trong SQL, các nhà phát triển thường phải đối mặt với những tình huống yêu cầu họ phải phân tích các truy vấn phức tạp, tái sử dụng logic hoặc bao hàm các quy tắc kinh doanh để sử dụng lặp lại. Có ba tính năng mạnh mẽ giúp quản lý độ phức tạp và cải thiện hiệu quả, mỗi tính năng phục vụ một mục đích khác nhau:

  • Subqueries - cho phép tính toán nhanh, nội tuyến trong một truy vấn.
  • Common Table Expressions (CTEs) - cải thiện khả năng đọc và hỗ trợ đệ quy trong các truy vấn.
  • Stored Procedures - bao hàm logic kinh doanh tái sử dụng, có tham số, được lưu trữ ở cấp độ cơ sở dữ liệu.

Việc hiểu sự tương đồng, khác biệt và các trường hợp sử dụng tốt nhất là điều cần thiết để viết mã SQL hiệu quả và dễ bảo trì.

1. Subquery

Subquery là một truy vấn lồng bên trong một truy vấn khác. Nó có thể được sử dụng trong SELECT, FROM, hoặc WHERE để cung cấp các kết quả trung gian.
Ví dụ:

sql Copy
SELECT employee_name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

🟢Tốt nhất cho: Lọc hoặc tính toán nhanh, một lần.
🔴Giới hạn: Không thể tái sử dụng giữa các truy vấn và có thể ảnh hưởng đến hiệu suất nếu sử dụng quá mức.

2. Common Table Expression (CTE)

CTE là một tập hợp kết quả tạm thời được định nghĩa với từ khóa WITH. Nó cải thiện khả năng đọc và hỗ trợ đệ quy.
Ví dụ:

sql Copy
WITH AvgSalary AS (
    SELECT AVG(salary) AS avg_sal
    FROM employees
)
SELECT employee_name, salary
FROM employees, AvgSalary
WHERE salary > avg_sal;

🟢Tốt nhất cho: Cấu trúc các truy vấn phức tạp, cải thiện khả năng đọc và xử lý các tình huống đệ quy như phân cấp.
🔴Giới hạn: Chỉ tồn tại trong phạm vi truy vấn và không thể có tham số.

3. Stored Procedure

Stored procedure là một tập hợp các câu lệnh SQL đã biên dịch trước được lưu trữ trong cơ sở dữ liệu. Nó có thể nhận tham số, thực hiện nhiều thao tác và bao hàm logic kinh doanh.
Ví dụ:

sql Copy
CREATE PROCEDURE GetHighEarners(IN minSalary DECIMAL(10,2))
BEGIN
    SELECT employee_name, department, salary
    FROM employees
    WHERE salary > minSalary;
END;
CALL GetHighEarners(60000);

🟢Tốt nhất cho: Các thói quen có thể tái sử dụng, các thao tác có tham số và bao hàm logic kinh doanh.
🔴Giới hạn: Cần tạo và duy trì ở cấp độ cơ sở dữ liệu.

Tính Năng

Tính năng Subquery CTE Stored Procedure
Phạm vi Trong một truy vấn Trong một truy vấn Lưu trữ trong cơ sở dữ liệu
Tái sử dụng Không Chỉ trong cùng một truy vấn Có (toàn cục)
Tham số Không Không
Hỗ trợ Đệ quy Không
Có thể Sửa đổi Dữ liệu Hiếm khi (chỉ SELECT) Hiếm khi (chỉ SELECT) Có (INSERT/UPDATE/DELETE)
Sử dụng Tốt nhất Logic nội tuyến đơn giản Khả năng đọc truy vấn phức tạp Logic kinh doanh có thể tái sử dụng

Nơi Sử Dụng Mỗi Loại

Subquery

  • Trong một truy vấn đơn giản, một lần.
  • Khi lọc hoặc tổng hợp các giá trị bên trong một truy vấn.
  • ⚠️ Sử dụng subqueries liên quan một cách tiết kiệm để đảm bảo hiệu suất.

CTE

  • Khi logic truy vấn phức tạp hoặc cần đệ quy.
  • Giúp các truy vấn dễ đọc và dễ bảo trì.
  • Lý tưởng khi cùng một subquery được tham chiếu nhiều lần.

Stored Procedure

  • Khi logic cần tái sử dụng giữa nhiều truy vấn.
  • Đối với sửa đổi dữ liệu, quy tắc kinh doanh, hoặc các thao tác lặp lại.
  • Khi hiệu suất được cải thiện từ việc thực thi đã được biên dịch trước.
  • Khi cần tham số hoặc nhiều thao tác trong một lần gọi.

Kết luận

Trong SQL, stored procedures, CTEs và subqueries là những công cụ bổ sung cho nhau. Subqueries là lý tưởng cho các quy trình nội tuyến, nhanh; CTEs tạo điều kiện cho đệ quy và làm cho các truy vấn khó trở nên dễ đọc; và stored procedures chứa logic kinh doanh có thể tái sử dụng, có tham số cho các nhiệm vụ thường xuyên. Thêm vào đó, stored procedures thu hẹp khoảng cách giữa kiến trúc cơ sở dữ liệu và các nguyên tắc lập trình bằng cách thể hiện sự trừu tượng, tái sử dụng và tính mô-đun, giống như các hàm trong Python. Bằng cách chọn phương pháp phù hợp cho tình huống thích hợp, các nhà phát triển có thể tạo ra SQL có thể mở rộng, dễ quản lý và hiệu quả.

📖 Tài liệu tham khảo & Đọc thêm

  1. Gravell, M. Sự khác biệt giữa CTE và subquery trên Stack Overflow – nêu bật khả năng đệ quy của CTEs. Link

  2. LearnSQL.com – cái nhìn tổng quan toàn diện về subqueries và CTEs với các ví dụ. Link

  3. KDnuggets (Tháng 4 năm 2025): SQL CTE vs Subquery: Cuộc tranh luận này chưa kết thúc đâu – so sánh chi tiết. Link

  4. Wikipedia – Stored Procedure – giải thích sâu về stored procedures, các trường hợp sử dụng và so sánh với các hàm. Link

  5. Hướng dẫn stored procedures của PostgreSQL – cú pháp và cách sử dụng cho các routine có ý thức giao dịch. Link

  6. Wikipedia – Correlated Subquery – giải thích mô hình thực thi và các cân nhắc về hiệu suất trong các subqueries liên quan. Link

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào