04/09/2024
Common Table Expressions (CTE) trong SQL: Giải pháp Tối Ưu cho Các Truy Vấn Phức Tạp?
Khi làm việc với các truy vấn phức tạp hoặc đòi hỏi nhiều phép ‘join’, việc kiểm soát được các câu lệnh làm sao cho dễ nhìn, có cấu trúc không phải là vấn đề đơn giản. Và lúc này, Common Table Expressions (CTE) coi như là 1 giải pháp có thể giúp ta giải quyết vấn đề này.
1. CTE là gì?
CTE (Common Table Expression) là một tính năng mạnh mẽ trong SQL cho phép bạn định nghĩa các bảng tạm thời ngay trong câu truy vấn. Những bảng này không tồn tại trong cơ sở dữ liệu như các bảng thực, mà chỉ tồn tại trong phạm vi của truy vấn. CTE giúp tăng cường tính rõ ràng và có thể tái sử dụng được trong các câu lệnh SQL phức tạp.
2.Lợi ích của CTE
2.1 Tăng tính rõ ràng và dễ hiểu: Khi bạn làm việc với các truy vấn lớn có nhiều phép JOIN và điều kiện WHERE phức tạp, việc đọc hiểu và bảo trì mã nguồn trở nên khó khăn. CTE giúp bạn chia nhỏ truy vấn thành các bước logic rõ ràng hơn, giúp mã nguồn dễ đọc và dễ bảo trì.
2.2 Tái sử dụng trong truy vấn: CTE cho phép bạn định nghĩa một tập hợp dữ liệu một lần và sau đó sử dụng lại nó nhiều lần trong cùng một truy vấn. Điều này đặc biệt hữu ích khi bạn cần sử dụng cùng một tập hợp kết quả cho nhiều phép tính hoặc lọc khác nhau.
2.3 Hỗ trợ đệ quy: CTE đệ quy là một trong những công cụ mạnh mẽ nhất của SQL để làm việc với các cấu trúc dữ liệu phân cấp, chẳng hạn như cây thư mục hoặc sơ đồ tổ chức. Bằng cách sử dụng CTE đệ quy, bạn có thể dễ dàng truy vấn và xử lý các dữ liệu có cấu trúc phức tạp này.
3. Cú pháp cơ bản của CTE
CTE được định nghĩa bằng từ khóa WITH, theo sau là tên của CTE và khối truy vấn. Sau khi được định nghĩa, CTE có thể được tham chiếu trong câu truy vấn chính như một bảng thông thường.
Ví dụ về một CTE đơn giản:
WITH EmployeeCTE AS (
SELECT EmployeeID, FirstName, LastName, DepartmentID
FROM Employees
WHERE DepartmentID = 5
)
SELECT *
FROM EmployeeCTE;
Trong ví dụ này, EmployeeCTE là một CTE được sử dụng để trích xuất dữ liệu từ bảng Employees. Kết quả của CTE sau đó được sử dụng trong truy vấn chính để lấy toàn bộ thông tin của nhân viên trong phòng ban có ID là 5.
4. Recursive CTE (CTE Đệ Quy)
Một trong những tính năng độc đáo của CTE là khả năng tự tham chiếu, hay còn gọi là đệ quy. Điều này cho phép bạn truy vấn các cấu trúc dữ liệu phân cấp một cách hiệu quả.
Ví dụ về CTE đệ quy để tính toán sơ đồ tổ chức:
WITH OrgChart AS (
SELECT EmployeeID, ManagerID, FirstName, LastName, 0 AS Level
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.ManagerID, e.FirstName, e.LastName, oc.Level + 1
FROM Employees e
INNER JOIN OrgChart oc ON e.ManagerID = oc.EmployeeID
)
SELECT *
FROM OrgChart
ORDER BY Level;
Trong ví dụ này, CTE đệ quy OrgChart bắt đầu bằng việc lấy dữ liệu của các nhân viên không có người quản lý (quản lý cấp cao nhất). Sau đó, nó liên tục truy vấn và thêm vào các nhân viên dưới quyền của từng quản lý, xây dựng một cấu trúc cây tổ chức.
5. Khi nào nên sử dụng CTE?
CTE rất hữu ích trong các tình huống sau:
• Khi bạn cần chia nhỏ một truy vấn phức tạp thành các phần nhỏ hơn, dễ quản lý hơn.
• Khi bạn muốn tái sử dụng cùng một tập hợp kết quả trong nhiều phép toán hoặc truy vấn.
• Khi bạn làm việc với các cấu trúc dữ liệu phân cấp và cần sử dụng truy vấn đệ quy.
• Khi bạn cần làm cho truy vấn của mình dễ đọc và dễ bảo trì hơn.
6. Kết luận
CTE là một công cụ mạnh mẽ trong SQL, giúp cải thiện khả năng viết truy vấn phức tạp một cách rõ ràng và hiệu quả hơn. Từ việc chia nhỏ các truy vấn phức tạp đến việc xử lý các cấu trúc dữ liệu phân cấp, CTE là một phần không thể thiếu đối với các nhà phát triển và quản trị viên cơ sở dữ liệu.
Nếu bạn chưa quen với CTE, hãy bắt đầu với các CTE đơn giản trong các truy vấn của bạn và dần dần khám phá tiềm năng của CTE đệ quy. Chắc chắn rằng, CTE sẽ giúp bạn nâng cao khả năng quản lý dữ liệu và tối ưu hóa các truy vấn của mình một cách đáng kể.
7. Tài liệu tham khảo
https://learn.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver16
P/s: Liệu CTE có phải là công cụ mạnh mẽ nhất trong việc đơn giản hóa các câu truy vấn phức tạp? Hay còn có giải pháp khác thay thế tốt hơn? Hãy đợi bài viết sau của mình nhé!