写点什么

SQL 的执行顺序以及它的重要性与元数据

  • 2024-06-21
    北京
  • 本文字数:1801 字

    阅读完需:约 6 分钟

SQL的执行顺序以及它的重要性与元数据

本文是一个关于 SQL 与构建 SQL 血缘内容,属于作者原撮。其中 SQL 的图是来自 @Josep Ferrer。

两个知识点

  1. SQL 的执行顺序与解释器

2.SQL 解析器构思元数据并产出影响与血缘分析


一、SQL 的执行顺序与解释器


SQL查询语句的执行顺序以及JOIN的使用。作为一种声明式编程语言,SQL的执行顺序和我们编写的语句顺序并不完全相同。
理解SQL的执行顺序,有助于使用者更好地优化查询语句,提高查询效率。此外,SQL中的JOIN语句是非常重要和常用的,用于关联多个表进行查询。
SQL是一种声明式的编程语言。这意味着使用者在编写SQL查询语句时,只需要指定想要的结果,而不需要关心具体的实现步骤。数据库系统会根据最优的执行计划来执行使用者的查询。
复制代码


先来看一条完整的 SQL


一个比较完整的 SQL 查询语句的编写顺序:


SELECT DISTINCT Table1., Table2.FROMTable1 JOIN Table2 ON matching_conditionWHERE constraint_expressionGROUP BY [columns]HAVING constraint_expressionORDER BY [columns]


LIMIT count 这条 SQL 的关键字:



SQL 在实际执行时并不是完全按照使用者编写的顺序来的。了解执行顺序有助于使用者理解 SQL 的运行机制,写出更加高效的查询语句。


其具体的执行顺序


  • FROM Table1 和 JOIN Table2 把两个表连接起来。连接的条件是 ON Table1.col1 = Table2.col2,即两个表的某些列相等时进行连接


  • 执行 WHERE constraint_expression,根据约束表达式过滤不符合条件的行


  • 接着是 GROUP BY [columns],按照指定的列将结果集分组


  • 再执行 HAVING constraint_expression,对分组后的结果集进一步过滤


  • 之后执行 SELECT,选择结果集需要保留的列


  • 再执行 ORDER BY [columns],按指定的列对结果集排序


  • 最后通过 LIMIT count 限制结果集数量,返回前 count 行数据



再来个例子:有两张用户表分别是



要执行的 SQL 如下:


SELECTu.region,SUM(o.amount) AS total_amountFROM users uJOIN orders oON u.user_id = o.user_idWHERE o.create_time BETWEEN '2023-01-01' AND '2023-12-31'GROUP BY u.regionHAVING SUM(o.amount) > 1000000ORDER BY total_amount DESCLIMIT 10;


按照的顺序:


  1. FROM & JOIN: 首先从用户表(users)和订单表(orders)中读取数据。通过 JOIN 将两张表按照用户 ID(user_id)进行关联,得到一个中间结果集。中间结果集包含了用户的地区信息和订单的金额、时间等信息。


  1. WHERE: 对上一步得到的中间结果集进行过滤。条件是订单的创建时间(create_time)在'2023-01-01'到'2023-12-31'之间。这一步删除了不在指定时间范围内的订单数据。


  1. GROUP BY: 将上一步的结果集按照用户所在地区(region)进行分组。这一步将相同地区的用户订单信息聚合在一起。


  1. HAVING: 对分组后的结果集进一步过滤。条件是每个地区的总订单金额大于 1000000。这一步删除了消费总额不满足条件的地区。


  1. SELECT: 选择结果集中需要保留的列,包括地区(region)和总金额(total_amount)。其中总金额是通过 SUM(o.amount)计算得到的。


  1. ORDER BY: 按照总金额(total_amount)对结果集进行倒序排序。这一步将消费总额高的地区排在前面。


  1. LIMIT: 限制结果集的数量为 10。这一步返回消费总额最高的前 10 个地区。


最终得到了一个按照消费总额倒序排列的地区列表,可以清楚地看到哪些地区的用户消费最多。通过这个例子,我们综合运用了 SQL 的执行顺序和 JOIN 操作,实现了一个实际的数据分析需求。


二.SQL 解析器构思元数据并产出影响与血缘分析


下图是笔者在 2009 年与技术一起做元数据产品时核心部分之一 SQL 解释器



通过该解释器将 ETL 的 SQL 全部解析


ETL 名称:in 、out、表、字段、条件 的结构。最后将这些结构连起来就是一个血缘图。下图是完整 SQL 元数据结构部分模型



其主要的内容可以简单理解为,将 SQL 语句解析为语法分析树,然后通过 Toke 序列转化为语法分析树,最终抽象语法树被传递给错误检查和语义分析阶段进行处理。


  • SQL 语句:用户或应用程序提交一个或多个 SQL 语句给数据库执行。

  • SQL 语句解析:数据库接收到 SQL 语句后,会对其进行词法和语法分析。词法分析将 SQL 语句分解成一个个 Token(如关键字、标识符、运算符等),语法分析则根据 SQL 语法规则验证这些 Token 序列是否构成一个有效的 SQL 语句

  • 生成语法树:如果 SQL 语句通过了词法和语法检查,解析器会根据语句的结构生成一棵语法树。语法树以树形结构表示 SQL 语句各个语法单元之间的关系,叶子节点对应 SQL 语句中的原子元素如表名、列名、值等,非叶节点则对应各种 SQL 子句如 SELECT、FROM、WHERE 等

  • 语义分析:语法树生成后还需进行语义检查,如检查表和列是否存在,列之间的数据类型是否匹配等

发布于: 14 分钟前阅读数: 6
用户头像

还未添加个人签名 2018-10-30 加入

公众号:松子聊数据

评论

发布
暂无评论
SQL的执行顺序以及它的重要性与元数据_数据中台_松子(李博源)_InfoQ写作社区