SQL 通用表达式CTE
CTE(通用表达式)为我们提供了一个临时的结果集,必须立即与Select、Insert、Update或Delete语句一起使用,也可以在创建视图时使用。它在查询开始时定义,然后可以在外部查询中执行多次。
有两种类型的CTE
非递归CTE
一个不引用自己,也不使用递归属性的CTE。
语法
WITH cte_name (col1,col2,. . . )
AS
(
CTE_definition
)
SELECT * FROM cte_name;
在这里,
- CTE_definition是查询。
-
在SELECT语句的位置,我们可以使用insert、delete或update语句来进行cte。
示例1
在这个例子中,我们将看看如何在sql中创建一个cte,并了解它的实际工作原理。
步骤
- 步骤1 − 创建一个cte
-
步骤2 − 使用AS关键字
-
步骤3 − 使用select语句从输入表中提取所需的数据。
-
步骤4 − 使用select查看数据。
输入
student
ID | Name | Course | CGPA | |
---|---|---|---|---|
1 | Rahul | CS | r@gmail.com |
9.2 |
2 | Suraj | AI | s@gmail.com |
9.6 |
3 | Ajeet | Mechanical | a@gmail.com |
7.2 |
4 | Manoj | Civil | m@gmail.com |
8.0 |
代码
WITH details#cte created
AS
(
SELECT id,name,cgpa FROM student WHERE cgpa>8.0
#selected the required details
)
SELECT id,name,cgpa FROM details;#to show the result.
输出
ID | Name | CGPA |
---|---|---|
1 | Rahul | 9.2 |
2 | Suraj | 9.6 |
示例2
在这个示例中,我们将创建多个CTE并将它们连接在一起以获得所需的输出。多个CTE的定义可以使用UNION、UNION ALL、JOIN、INTERSECT或EXCEPT来定义。
步骤
- 步骤1 - 创建CTE
-
步骤2 - 使用select从源表中提取数据
-
步骤3 - 创建另一个CTE
-
步骤4 - 使用select从源表中提取数据
-
步骤5 - 使用union在单个表中显示来自两个CTE的结果
输入
student
ID | Name | Course | CGPA | |
---|---|---|---|---|
1 | Rahul | CS | r@gmail.com | 9.2 |
2 | Suraj | AI | s@gmail.com | 9.6 |
3 | Ajeet | Mechanical | a@gmail.com | 7.2 |
4 | Manoj | Civil | m@gmail.com | 8.0 |
代码
WITH details#cte created
AS
(
SELECT id,name,cgpa FROM student WHERE cgpa>8.0
#selected the required details
),
table_1#another cte created
AS
(
SELECT id,name,cgpa FROM student WHERE cgpa<7.5
#selected the required details
)
SELECT id,name,cgpa FROM details;#to show result
UNION #used to join the cte output
SELECT id,name,cgpa FROM table_1#to show result
输出
ID | Name | CGPA |
---|---|---|
1 | Rahul | 9.2 |
2 | Suraj | 9.6 |
3 | Ajeet | 7.2 |
递归CTE
递归CTE是指引用自身的CTE。它会重复执行,直到我们获得完整的结果集。
语法
WITH RECURSIVE cte_name (col1,col2,. . . )
AS
(
CTE_definition
)
SELECT * FROM cte_name;
这里,cte_definition是使用union all、distinct和with clause构成的递归结构。
示例
在这个示例中,我们将看到递归cte的工作原理。
步骤
- 步骤1 − 创建递归cte
-
步骤2 − 从基表中选择数据
-
步骤3 − 为选择数据提供条件
-
步骤4 − 使用union all合并数据
-
步骤5 − 使用内连接合并记录
-
步骤6 − 使用select显示输出
输入
Student_data
ID | Name | Branch | Roll. no |
---|---|---|---|
1A | Monu | BAO | Null |
2A | Ansh | OGI | 1 |
3A | Rahul | IOT | 2 |
4A | Disha | CCVT | 3 |
代码
WITH RECURSIVE specific_data(id,name,branch,sap_id,studentlevel)
#recursive cte created
AS
(
SELECT id,name,branch,sap_id,1#data selected from base table
FROM student_data WHERE sap_id IS NULL
#condition is provided
UNION ALL#used to merge the data
SELECT s.id,s.name,s.branch,s.sap_id,d.studentlevel+1#data selected
FROM student_data AS s
INNER JOIN specific_data AS d
#used to join entities
ON s.sap_id=d.id
)
SELECT name,branch,studentlevel FROM specific_data
#used to display output
输出
Name | Branch | student_level |
---|---|---|
Monu | BAO | 1 |
Ansh | OGI | 2 |
Rahul | IOT | 3 |
Disha | CCVT | 4 |
结论
CTE用于提供一个可以在select、update、insert或delete语句中引用的临时结果集。CTE可以是非递归的或递归的。非递归的CTE不引用自身。在第一个例子中,我们看到了使用WITH子句正常创建CTE的方法,在第二个例子中,我们使用union、join或intersect来处理多个CTE。第二部分是递归的CTE,它引用自身并重复执行。在这个例子中,我们使用WITH RECURSIVE子句来查看递归CTE的工作原理。