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

So sánh Subquery, CTE và Stored Procedure trong SQL

Đăng vào 2 ngày trước

• 5 phút đọc

Chủ đề:

KungFuTech

Giới thiệu

Trong thế giới phát triển cơ sở dữ liệu, việc hiểu sự khác biệt giữa các cấu trúc SQL như subquery, Common Table Expressions (CTEs) và stored procedures là rất quan trọng. Mỗi công cụ này đều phục vụ những mục đích khác nhau và có những đặc điểm riêng. Bài viết này sẽ giải thích từng loại, làm nổi bật sự khác biệt của chúng, và cung cấp ví dụ chi tiết sử dụng cú pháp SQL.

Mục lục

  1. Subquery
  2. Common Table Expression (CTE)
  3. Stored Procedure
  4. Thực tiễn tốt nhất
  5. Cạm bẫy thường gặp
  6. Mẹo hiệu suất
  7. Khắc phục sự cố
  8. Câu hỏi thường gặp

1. Subquery

Định nghĩa

Subquery là một truy vấn lồng trong một truy vấn khác (thường gọi là truy vấn bên ngoài). Nó được sử dụng để trả về dữ liệu mà truy vấn bên ngoài xử lý. Subqueries thường được đặt trong dấu ngoặc đơn và có thể xuất hiện trong các điều khoản như SELECT, WHERE hoặc FROM.

Trường hợp sử dụng

Khi bạn cần một tập hợp kết quả tạm thời để lọc, tính toán hoặc so sánh trong một truy vấn duy nhất.

Đặc điểm

  • Thực thi đầu tiên, và kết quả của nó được sử dụng bởi truy vấn bên ngoài.
  • Có thể là correlated (phụ thuộc vào truy vấn bên ngoài) hoặc non-correlated (độc lập).
  • Sử dụng một lần, không thể tái sử dụng giữa các truy vấn.
  • Có thể ảnh hưởng đến hiệu suất cho các truy vấn phức tạp do thực thi lặp lại.

Ví dụ

Giả sử bạn có bảng Employees và muốn tìm những nhân viên có mức lương cao hơn mức lương trung bình.

sql Copy
SELECT EmployeeID, FirstName, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);

Trong ví dụ này, subquery (SELECT AVG(Salary) FROM Employees) tính toán mức lương trung bình, và truy vấn bên ngoài lọc ra những nhân viên có mức lương vượt quá mức trung bình đó.

2. Common Table Expression (CTE)

Định nghĩa

CTE là một tập hợp kết quả tạm thời được định nghĩa trong một truy vấn duy nhất bằng cách sử dụng câu lệnh WITH. Nó có tên và có thể được tham chiếu nhiều lần trong truy vấn chính.

Trường hợp sử dụng

Khi bạn cần một kết quả trung gian có thể đọc được và tái sử dụng trong một truy vấn, đặc biệt cho các truy vấn phức tạp hoặc đệ quy.

Đặc điểm

  • Cải thiện khả năng đọc và bảo trì của truy vấn so với subqueries.
  • Có thể được tham chiếu nhiều lần trong cùng một truy vấn.
  • Hỗ trợ đệ quy cho dữ liệu phân cấp (ví dụ: biểu đồ tổ chức).
  • Tạm thời và chỉ tồn tại trong thời gian truy vấn.

Ví dụ

Sử dụng cùng một bảng Employees, tính toán mức lương trung bình và sử dụng nó để lọc nhân viên.

sql Copy
WITH AvgSalary AS (
    SELECT AVG(Salary) AS AvgSal
    FROM Employees
)
SELECT EmployeeID, FirstName, Salary
FROM Employees, AvgSalary
WHERE Salary > AvgSalary.AvgSal;

Trong ví dụ này, CTE AvgSalary tính toán mức lương trung bình, và truy vấn chính tham chiếu đến nó. Điều này dễ đọc hơn so với subquery.

3. Stored Procedure

Định nghĩa

Stored procedure là một tập hợp các câu lệnh SQL được biên dịch trước và lưu trữ trong cơ sở dữ liệu với một tên, có thể được thực thi theo yêu cầu. Nó có thể chấp nhận tham số và bao gồm các logic như vòng lặp hoặc điều kiện.

Trường hợp sử dụng

Cho các hoạt động phức tạp có thể tái sử dụng mà cần thực thi nhiều lần, chẳng hạn như xử lý dữ liệu, báo cáo hoặc logic kinh doanh.

Đặc điểm

  • Được lưu trong cơ sở dữ liệu và có thể tái sử dụng giữa nhiều phiên hoặc ứng dụng.
  • Có thể bao gồm logic quy trình (ví dụ: IF, WHILE) và xử lý lỗi.
  • Có thể chấp nhận các tham số đầu vào/đầu ra để có hành vi động.
  • Cải thiện hiệu suất (được biên dịch trước) và bảo mật (truy cập có kiểm soát).

Ví dụ

Tạo một stored procedure để cập nhật mức lương của nhân viên dựa trên EmployeeID của họ.

sql Copy
CREATE PROCEDURE UpdateEmployeeSalary
    @EmployeeID INT,
    @NewSalary DECIMAL(10, 2)
AS
BEGIN
    UPDATE Employees
    SET Salary = @NewSalary
    WHERE EmployeeID = @EmployeeID;
END;

-- Thực thi stored procedure
EXEC UpdateEmployeeSalary @EmployeeID = 101, @NewSalary = 75000.00;

Stored procedure UpdateEmployeeSalary nhận hai tham số và cập nhật bảng Employees. Nó có thể được tái sử dụng bất cứ khi nào bằng cách gọi EXEC.

4. Thực tiễn tốt nhất

  • Sử dụng CTE cho các truy vấn phức tạp và để cải thiện khả năng đọc.
  • Chỉ sử dụng subquery khi cần truy vấn nhanh chóng mà không cần tái sử dụng.
  • Tối ưu hóa stored procedure với việc xử lý lỗi và tham số hợp lý.

5. Cạm bẫy thường gặp

  • Subquery có thể làm giảm hiệu suất nếu lặp lại nhiều lần.
  • CTE không thể được sử dụng trong các tình huống đệ quy phức tạp nếu không được thiết kế chính xác.
  • Không sử dụng stored procedure cho các tác vụ đơn giản mà có thể thực hiện bằng truy vấn đơn giản hơn.

6. Mẹo hiệu suất

  • Đối với subquery, hãy cân nhắc sử dụng JOIN thay thế để cải thiện hiệu suất.
  • CTE nên được thiết kế để không tạo ra nhiều lần kết quả tạm thời không cần thiết.
  • Đảm bảo stored procedure được biên dịch và tối ưu hóa trước khi thực thi.

7. Khắc phục sự cố

  • Nếu một subquery không trả về kết quả như mong muốn, hãy kiểm tra điều kiện WHERE và cấu trúc của truy vấn.
  • Đối với CTE, chắc chắn rằng bạn đã sử dụng tên đúng và không có lỗi cú pháp.
  • Khi gặp lỗi trong stored procedure, kiểm tra các tham số truyền vào và logic điều kiện.

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

Q: Subquery có thể được sử dụng trong các câu lệnh nào?
A: Subquery có thể được sử dụng trong các câu lệnh SELECT, INSERT, UPDATE và DELETE.

Q: CTE có thể được gọi là một subquery không?
A: Không, CTE và subquery là hai khái niệm khác nhau mặc dù chúng có thể phục vụ mục đích tương tự.

Q: Stored procedure có thể trả về giá trị không?
A: Có, stored procedure có thể trả về giá trị thông qua các tham số đầu ra hoặc thông qua câu lệnh RETURN.

Kết luận

Trong bài viết này, chúng ta đã khám phá sự khác biệt giữa subquery, CTE và stored procedure trong SQL. Mỗi công cụ đều có ưu điểm và nhược điểm riêng, và việc lựa chọn sử dụng cái nào phụ thuộc vào nhu cầu cụ thể của bạn. Hãy áp dụng những kiến thức này vào dự án của bạn để tối ưu hóa quy trình phát triển cơ sở dữ liệu. Nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại để lại câu hỏi trong phần bình luận bên dưới!

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