SQL 语句是操作数据库和数据库中数据的最常用的方法,通过SQL标准中定义的一系列的关键字,我们可以管理数据库和操作数据库中的数据。
SQL 语句的具体执行过程,可以根据 SQL语句的不同分成不同的执行步骤,每个步骤中通常都会包含一个或多个SQL算子。
本文介绍SQL语句中常见的基本SQL算子。
一、理解SQL算子
SQL算子可以理解为SQL语句执行过程中各个步骤的具体动作。
比如如下SQL语句:
SELECT
ProductID, SUM(Amount) TotalAmount
FROM
OrderItem i, Order o
WHERE
i.OrderID = o.OrderID
AND o.OrderDate >= ‘2022-03-01’
Group By
ProductID
Having
SUM(Amount) > 1000
Order By
TotalAmount DESC, ProductID
Limit 10 ;
其中的 SELECT、SUM、FROM、WHERE、Group By、Having、Order By、Limit 都是SQL算子。
二、基本SQL算子
1、From 算子
From 算子是 SQL 语句中最基本的算子,用于定位 SQL 语句的操作对象,主要出现在 SELECT 语句中,但 DDL 语句和 DML 语句中则隐式地包含了 From 算子。
2、Scan 算子
Scan 算子是用于扫描操作的算子,作用于表和视图。Scan 算子根据扫描的执行方式可以分为 TableScan 算子和 IndexScan 算子,分别执行顺序扫描和基于索引扫描。
3、Filter 算子
顾名思义,Filter 算子是条件过滤算子,用于在 SQL 语句中根据一定的条件过程表或视图中的数据。Filter 算子中至少包含一个过滤条件,且 Filter 算子中可以包含非常复杂的过滤条件。
4、Join 算子
Join 算子是用于完成连接操作的所有算子的统称,Join 算子本身包含了连接条件。在具体的 SQL 语句中,Join 算子可以隐式表达,也可以表达为 join … on … 形式。
5、分组算子
分组算子是完成分组操作的算子,最常用的是 Group 算子和 Having 算子,还包括 Cube 算子、Rollup 算子等。
Group 算子是完成分组操作的核心算子,而 Having 算子则提供了分组筛选条件。
6、排序算子
Order 算子是 SQL 语句中用于执行排序操作的算子。排序操作是 SQL 语句中的常见操作,也是重要操作,而排序算子的具体实现,在不同的数据库中经常不同,同一种数据库中也会提供多种算法用于完成排序。
7、投影算子
投影是 SELECT 语句中的必要组成部分,表达了 SELECT 语句的输出内容的结构。投影算子可以有多种形式,甚至投影列本身就是一个独立的 SQL 语句(子查询),最常见的表现形式是表或视图中的列,此外还可以表现为 Scalar 算子、Aggregation 算子或 Window 算子。
Scalar 算子是完成标量运算的算子,都涉及到标量函数运算。
Aggregation 算子是聚合运算算子,包括 COUNT、MAX/MIN、SUM/AVG 等,通常结合分组算子出现。
Window 算子是窗口操作算子,以窗口函数形式出现。Window 算子是个复合结构,可以进一步细分为窗口函数算子、Over 算子、Partition 算子和Order 算子。
8、Value 算子
Value 算子是完成非投影部分的求值运算的算子,一般表现为标量函数,通常出现于其它多种算子的各种条件表达式中,比如出现在 Filter 算子或 Join 算子中完成过滤条件表达式或连接条件表达式的求值运算。
9、Top N 算子
Top N 算子是完成限定操作的算子的统称,限定操作指的是基于结果集并在结果集上完成某种行为的操作,Top N算子的最典型的应用场景是分页。
Top N 算子具体可以表达为 Top、Limit、Offset、RowNum 等关键字。
10、Exchange 算子
Exchange 算子是 SQL 语句执行过程中在各执行步骤之内或之间完成数据交换的算子,在并行场景或分布式场景中起作用。Exchange 算子是由数据库引擎调度的算子,其动作不能由人工参与。
三、基本SQL算子的执行顺序
SQL 语句中 SQL 算子的执行顺序与语句本身及优化器的优化结果有关。在 SQL 语句的视角上, 不同的 SQL 算子通常按下图的顺序执行:
在优化器的作用下,上面执行顺序可能会有变化,比如有可能会先执行 Group 算子的操作,之后再进行 Join 算子的操作。