CTE (Common Table Expression) là một biểu thức bảng tạm thời, được đặt tên và có thể sử dụng như một bảng thật trong truy vấn kế tiếp ngay sau đó.
Nó chỉ tồn tại trong phạm vi của câu lệnh SQL chứa nó.
Bắt đầu bằng từ khóa WITH, theo sau là tên CTE và phần thân AS (...)
WITH TenCTE AS (
-- Truy vấn tạo bảng tạm
SELECT ...
)
-- Truy vấn chính sử dụng CTE
SELECT * FROM TenCTE
WHERE ...;
Ưu điểm | Giải thích |
---|---|
📘 Tăng tính rõ ràng | Giúp chia nhỏ truy vấn dài ra thành các phần dễ đọc |
🔁 Có thể đệ quy | Cho phép tạo CTE gọi lại chính nó để duyệt cây, cấp bậc |
🧪 Tái sử dụng dễ dàng | Có thể sử dụng nhiều lần trong cùng một câu truy vấn |
✅ Thay thế tốt cho subquery và view tạm thời | Giữ cho câu SQL gọn hơn |
CTE đơn: như ví dụ bạn vừa học
CTE đệ quy: dùng trong cây phân cấp (ví dụ: thư mục cha – con, nhân viên – cấp trên)
Nhiều CTE: có thể định nghĩa nhiều CTE nối nhau bằng dấu phẩy ,
Lưu ý | Giải thích |
---|---|
Chỉ dùng được trong 1 câu lệnh SQL kế tiếp | Không tồn tại lâu như view hoặc table |
Không thể ORDER BY trong phần định nghĩa CTE (trừ khi dùng với TOP ) |
Sắp xếp phải nằm ngoài |
Không nên quá lạm dụng | CTE rất tiện, nhưng nếu lồng quá nhiều tầng có thể làm chậm truy vấn |
✅ Ví dụ thực tế đơn giản lại:
WITH HocSinhCTE AS (
SELECT
MaHS,
TenHS,
(Toan + Ly + Hoa) / 3.0 AS DiemTB
FROM HocSinh
)
SELECT *
FROM HocSinhCTE
WHERE DiemTB >= 7;
Nếu không dùng CTE bạn phải code như sau:
SELECT *
FROM (
SELECT
MaHS,
TenHS,
Toan,
Ly,
Hoa,
ROUND((Toan + Ly + Hoa) / 3.0, 2) AS DiemTB
FROM HocSinh
) AS T
WHERE DiemTB >= 7;
WITH – Common Table Expression (CTE) trong SQL Server