🌳 MySQL 语法树解析器

深入理解 SQL 如何从文本解析为抽象语法树 (AST)

📝 SQL 源代码

🔍 语法树可视化 (AST)

节点详情

语句节点 (Statement)
表达式节点 (Expression)
标识符节点 (Identifier)
字面量节点 (Literal)
运算符节点 (Operator)

MySQL 语法树核心节点类型

🔷 SELECT_STMT - 查询语句

SELECT 语句的根节点,包含 select_list、from_clause、where_clause、group_by、order_by 等子节点。

🔷 INSERT_STMT - 插入语句

INSERT 语句的根节点,包含 table_reference、column_list、values_clause 或 select_stmt 子节点。

🔷 UPDATE_STMT - 更新语句

UPDATE 语句的根节点,包含 table_references、set_clause、where_clause 等子节点。

🔷 DELETE_STMT - 删除语句

DELETE 语句的根节点,包含 table_references、where_clause、order_by、limit 等子节点。

🟢 TABLE_REF - 表引用

表示表引用,包含数据库名、表名、别名等信息。JOIN 操作中会包含多个 TABLE_REF。

🟢 COLUMN_REF - 列引用

表示列引用,包含表名/别名前缀和列名,如 t1.id。

🟢 FUNC_CALL - 函数调用

表示函数调用节点,包含函数名和参数列表,如 COUNT(*)、MAX(salary)。

🟢 BINARY_OP - 二元运算

表示二元运算表达式,如 =、<、>、AND、OR、+、- 等运算符。

🔴 IDENT - 标识符

表示标识符节点,存储表名、列名、别名等名称信息。

🟣 LITERAL - 字面量

表示常量值,包括字符串、数字、NULL、布尔值等。

🟣 NUMBER_LITERAL - 数字字面量

表示数字常量,如整数、浮点数。

🟣 STRING_LITERAL - 字符串字面量

表示字符串常量,用单引号或双引号包裹的文本。

🟠 JOIN - 连接操作

表示 JOIN 操作节点,包含 JOIN 类型、左表、右表和 ON 条件。

🟠 ORDER_BY - 排序

表示 ORDER BY 子句,包含排序表达式和排序方向 (ASC/DESC)。

🟠 GROUP_BY - 分组

表示 GROUP BY 子句,包含分组表达式列表。

🟠 LIMIT - 限制

表示 LIMIT 子句,包含偏移量和行数限制。

MySQL 语法树结构规则

节点类型 必需子节点 可选子节点 说明
SELECT_STMT select_list from_clause, where_clause, group_by, having, order_by, limit SELECT 语句根节点
INSERT_STMT table_ref, values_clause column_list, on_duplicate INSERT 语句根节点
UPDATE_STMT table_refs, set_clause where_clause, order_by, limit UPDATE 语句根节点
DELETE_STMT table_refs where_clause, order_by, limit DELETE 语句根节点
FROM_CLAUSE table_reference_list join_clauses FROM 子句节点
WHERE_CLAUSE condition_expr - WHERE 条件节点
JOIN left_table, right_table, join_type on_condition JOIN 操作节点
BINARY_EXPR left, operator, right - 二元表达式节点
FUNC_CALL func_name, args_list distinct_flag 函数调用节点
SUBQUERY select_stmt correlation 子查询节点

SQL 解析流程

1️⃣ 词法分析 (Lexical Analysis)

将 SQL 字符串分割成 Token 序列。识别关键字 (SELECT, FROM)、标识符、运算符、字面量等。

2️⃣ 语法分析 (Syntax Analysis)

根据 MySQL 语法规则,将 Token 序列构建成语法树。检查语法正确性。

3️⃣ 语义分析 (Semantic Analysis)

检查表名、列名是否存在,验证数据类型兼容性,解析别名引用。

4️⃣ 查询优化 (Query Optimization)

基于语法树生成执行计划,选择最优的索引和 JOIN 顺序。