SQL 语句的抽象语法树(AST)通过 词法分析 和 语法分析 生成,其结构反映了 SQL 的语法规则。以下是该语句的 AST 生成逻辑及示例结构:
1. 词法分析(Lexical Analysis)
将 SQL 字符串拆分为 标记(Tokens):
- 关键字:SELECT、FROM、WHERE
- 标识符:name、age、users
- 运算符:>
- 字面量:18
- 分隔符:,(逗号)
2. 语法分析(Syntax Analysis)
根据 SQL 语法规则构建 AST,示例结构如下:
- Root: SELECT_STATEMENT
├── SELECT_CLAUSE
│ ├── COLUMN(name)
│ └── COLUMN(age)
├── FROM_CLAUSE
│ └── TABLE(users)
└── WHERE_CLAUSE
└── BINARY_EXPRESSION(>)
├── COLUMN_REFERENCE(age)
└── LITERAL(18)
3. AST 节点详解
节点类型 | 子节点/值 | 说明 |
SELECT_STATEMENT | SELECT_CLAUSE, FROM_CLAUSE, WHERE_CLAUSE | 整个查询的根节点 |
SELECT_CLAUSE | COLUMN(name), COLUMN(age) | 查询的列列表 |
FROM_CLAUSE | TABLE(users) | 数据来源表 |
WHERE_CLAUSE | BINARY_EXPRESSION(>) | 过滤条件 |
BINARY_EXPRESSION | COLUMN_REFERENCE(age), LITERAL(18) | 比较表达式(左值、操作符、右值) |
4. 生成工具与库
ANTLR:通过预定义的 SQL 语法规则(如 MySQL.g4)自动生成 AST。
antlr4
selectStatement
: SELECT selectElements FROM tableName (WHERE whereCondition)?
;
SQLParser(如 JSqlParser、Apache Calcite):直接解析 SQL 为 AST 或逻辑计划。
// 使用 JSqlParser 解析示例
Select select = (Select) CCJSqlParserUtil.parse("SELECT name, age FROM users WHERE age > 18");
5. 应用场景
- 查询优化:分析 WHERE 条件结构,优化索引使用。
- 权限校验:检查访问的列和表是否符合权限规则。
- SQL 格式化:根据 AST 重新生成标准化 SQL。
总结
该 SQL 的 AST 反映了其语法结构:从 SELECT 列列表到 WHERE 条件表达式。AST 是 SQL 解析、优化和执行的基础,工具(如 ANTLR、JSqlParser)可自动化生成并操作此树。