MySQL Recursive CTE cho phép người dùng viết các truy vấn liên quan đến các hoạt động đệ quy. Recursive CTE là một biểu thức được xác định đệ quy. Nó rất hữu ích trong dữ liệu phân cấp, truyền tải biểu đồ, tổng hợp dữ liệu và báo cáo dữ liệu. Trong bài viết này, chúng ta sẽ thảo luận về Recursive CTE với cú pháp và ví dụ của nó.

Common Table Expressions (CTE - Biểu thức bảng chung) là một cách đặt tên cho các tập kết quả tạm thời được tạo bởi mỗi truy vấn trong MySQL. Mệnh đề WITH được sử dụng để xác định 1 CTE hoặc nhiều CTE trong một câu lệnh. Tuy nhiên, CTE chỉ có thể tham chiếu các CTE khác được xác định trước đó trong cùng mệnh đề WITH. Phạm vi của mỗi CTE được giới hạn trong câu lệnh mà nó được xác định.

Recursive CTE là một loại truy vấn con đề cập đến chính nó bằng tên riêng của nó. Để xác định CTE đệ quy, mệnh đề WITH RECURSIVE được sử dụng và nó phải có điều kiện kết thúc. CTE đệ quy thường được sử dụng để tạo chuỗi và duyệt dữ liệu có cấu trúc phân cấp hoặc cây.

Cú pháp

Cú pháp xác định CTE đệ quy trong MySQL như sau:

syntax

trong đó:

  • cte_name: Tên được đặt cho truy vấn con đệ quy được viết trong khối truy vấn con.

  • col1, col2, ..., colN: Tên được đặt cho các cột được tạo bởi truy vấn con.

  • subquery: Một truy vấn MySQL tham chiếu đến chính nó bằng cách sử dụng cte_name làm tên riêng. Tên cột được cung cấp trong câu lệnh SELECT phải khớp với tên được cung cấp trong danh sách, theo sau là cte_name.

Cấu trúc CTE đệ quy được cung cấp trong khối truy vấn con

syntax2

  • Câu lệnh SELECT đầu tiên là câu lệnh không đệ quy. Nó cung cấp các hàng đầu tiên cho tập kết quả.

  • UNION [ALL, DISTINCT] được sử dụng để thêm các hàng bổ sung vào tập kết quả trước đó. Việc sử dụng từ khóa ALLDISTINCT được sử dụng để thêm hoặc xóa các hàng trùng lặp trong tập kết quả cuối cùng.

  • Câu lệnh SELECT thứ hai là câu lệnh đệ quy. Nó tạo ra tập kết quả lặp đi lặp lại cho đến khi điều kiện được cung cấp trong mệnh đề WHERE là đúng.

  • Tập kết quả được tạo ra ở mỗi lần lặp sẽ lấy tập kết quả được tạo ra ở lần lặp trước đó làm bảng cơ sở.

  • Quá trình đệ quy kết thúc khi câu lệnh SELECT đệ quy không tạo thêm bất kỳ hàng nào.

Ví dụ:

Hãy xem xét một bảng có tên là “nhân viên”. Nó có các cột “id”, “name” và “salary”. Tìm mức lương trung bình của nhân viên đã làm việc tại công ty ít nhất 2 năm. Bảng “nhân viên” có các giá trị sau:

ví dụ 1

Vì vậy, câu truy vấn được đưa ra dưới đây:

query

Trong truy vấn này, trước tiên chúng tôi xác định CTE đệ quy có tên là “employee_tenure”. Nó tính toán nhiệm kỳ của mỗi nhân viên bằng cách nối đệ quy bảng “nhân viên” với chính CTE. Trường hợp cơ bản của đệ quy chọn tất cả nhân viên từ bảng “nhân viên” với nhiệm kỳ bắt đầu là 0. Trường hợp đệ quy kết hợp mỗi nhân viên với CTE và tăng nhiệm kỳ của họ lên 1.

CTE “employee_tenure” thu được có các cột “id”, “name”, “salary”, “hire_date” và “tenure”. Sau đó chúng tôi chọn mức lương trung bình của nhân viên có thời gian làm việc ít nhất là 2 năm. Nó sử dụng câu lệnh SELECT đơn giản với mệnh đề WHERE để lọc ra những nhân viên có thời gian làm việc dưới 2.

Đầu ra của truy vấn sẽ là một hàng duy nhất. Nó sẽ có mức lương trung bình của nhân viên đã gắn bó với công ty ít nhất 2 năm. Giá trị cụ thể sẽ phụ thuộc vào mức lương ngẫu nhiên được gán cho từng nhân viên trong bảng “nhân viên”.

Kết luận

MySQL Recursive CTE là một biểu thức được xác định đệ quy và rất hữu ích trong dữ liệu phân cấp, duyệt đồ thị, tổng hợp dữ liệu và báo cáo dữ liệu. Recursive CTE đề cập đến chính nó bằng tên riêng của nó và phải có điều kiện kết thúc. Cú pháp để xác định Recursive CTE bao gồm việc sử dụng mệnh đề WITH RECURSIVE và các truy vấn con không đệ quy và đệ quy.

Nguồn: https://www.tutorialspoint.com/mysql-recursive-cte-common-table-expressions