【MySQL·8.0·源码】MySQL 语法树基础知识

基础

我们都知道 SQL 语句经过词法分析器时,识别扫描输入的 SQL 语句,将关键词、标识符、常量等分解转换成独立的 tokens,进一步在语法分析阶段根据语法规则检查 tokens 序列的结构并不断 shift 、reduce 构建成 SQL 语法解析树。

在 MySQL 中,撇去解析树构建过程中的结构,最终生成语法树最重要的两个结构就是 Query_expressionQuery_block

Query_expression 对应 用于描述查询表达式

(SELECT column1 FROM table1 WHERE condition1)
UNION
(SELECT column2 FROM table2 WHERE condition2);

Query_block 则对应 用以描述查询规范或定义,表示一个 SELECT 主体部分,通常包括查询的各个组成部分,例如要选择的列、查询的表、过滤条件等。

SELECT
  [DISTINCT | ALL] select_list
FROM
  table_reference
[WHERE
  search_condition]
[GROUP BY
  grouping_column_reference,...]
[HAVING
  search_condition]
[ORDER BY
  order_column_reference [ASC | DESC],...];

SQL 表达式可能是一条简单的 SELECT
select * from t1;

也可能是多条 SELECT 的代数运算,例如: UNIONINTERSET 或者 EXCEPT 运算。
select * from t1 union select * from t2 union select * from t3 order by 1;

所以 Query_expression 的数据结构中主要维护的是表达式或者语句之间关系

class Query_expression {
  Query_expression *next;
  Query_expression **prev;
  Query_block *master;
  Query_block *slave;
}

Query_block 代表的是某条具体的 SQL,所以SELECT 语句中的所有 Clause 都在 Query_block

  •  class Query_block : public Query_term
        mem_root_deque<Item*> fields;
    

    Q1:

    select c1,c2,c3 from t1;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第1张图片

    Q2:

    select c1+3, "joy", max(c2) from t1;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第2张图片

  • select * from t1 where c1 > 20 and c1 <= 30 or c1 + c2 > c3;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第3张图片

  • SELECT c1, c2, COUNT(*) AS count_rows
    FROM t1
    GROUP BY c1, c2;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第4张图片

  • select * from t1 group by c1 with rollup;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第5张图片

  • select c1, sum(c2) as total from t1 group by c1 having total < 5;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第6张图片

  • select * from t1 order by c1, c2 desc;
    

    【MySQL·8.0·源码】MySQL 语法树基础知识_第7张图片

select * from t1 where c1 in (select c2 from t2);

【MySQL·8.0·源码】MySQL 语法树基础知识_第8张图片

SELECT *
FROM t1
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.c1 = t2.c2);

【MySQL·8.0·源码】MySQL 语法树基础知识_第9张图片

你可能感兴趣的:(MySQL,8.1,源码,mysql,数据库)