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

基础

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

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

Query_expression 对应 <query expression> 用于描述查询表达式

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

Query_block 则对应 <query specification> 用以描述查询规范或定义,表示一个 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

  • <select list>
  • <table expression><from clause><table reference>
  • <where clause>
  • <group by clause>
  • <having clause>
  • <order by clause>
  • <rollup clause>
class Query_block : public Query_term
    mem_root_deque<Item*> fields;
    SQL_I_List<Table_ref> m_table_list;
    Item *m_where_cond;
    Item *m_having_cond;
    SQL_I_List<ORDER> order_list;
    SQL_I_List<ORDER> group_list;
    Item *select_limit;
    Item *offset_limit;
    Prealloced_array<Item_rollup_group_item*, 4> rollup_group_items;
    Prealloced_array<Item_rollup_sum_switcher*, 4> rollup_sums;
    LEX *parent_lex;
    Query_block *next;
    Query_expression *master;
    Query_expression *slave;
    Query_block *link_next;
    Query_block **link_prev;
    Query_result *m_query_result;
}

一些常见 SQL 语法树中 Query_expressionQuery_bloack 之间的关系可以阅读【MySQL·8.0·源码】MySQL 语法树结构

Item

从上面的 Query_block 中的各个子句上看到大量的 Item 结构
MySQL 源码使用一个 Item 基类来表示在关系查询中出现的任意类型的 expression (表达式)

  • 从类的继承关系角度来看,下面一些常见的继承 Item 的子类

    class Item
    	+--Item_row
    	+--Item_basic_constant
         +--Item_num
            +--Item_int
            +--Item_decimal
            +--Item_float
         +--Item_null
         +--Item_string
         +--Item_json
         +--..
    	+--Item_ident
         +--Item_field
         +--Item_ref
    	+--Item_param
    	+--Item_result_field
         +--Item_subselect
            +--Item_singlerow_subselect
            +--Item_exists_subselect
         +--Item_func
            +--Item_str_func
            +--Item_sum
            +--Item_timeval_func
            +--...
      +--...
    
  • 从 SQL 语句各表达式的角度来看

    • lieral(constant)values 字面值、常量值
    • <column references> 列引用
    • <variable references> 变量引用
    • 表达式
      • <predicates> 谓词表达式
        • <comparison predicate> 比较谓词
        • <between predicate>
        • <in predicate>
        • <like predicate>
        • <exists predicate>
        • <match predicate>
      • <numeric value function><string value function>算术和字符串函数
      • <row value expressiion>行对象
      • <mathod reference>函数引用
      • <subquery>子查询

常见表达式对应的 Item

  • <select list>

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

    Q1:

    select c1,c2,c3 from t1;
    

    在这里插入图片描述

    Q2:

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

    在这里插入图片描述

  • <where clause>

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

    在这里插入图片描述

  • <group by clause>

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

    在这里插入图片描述

  • <rollup clause>

    select * from t1 group by c1 with rollup;
    

    在这里插入图片描述

  • <having clause>

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

    在这里插入图片描述

  • <order by clause>

    select * from t1 order by c1, c2 desc;
    

    在这里插入图片描述

  • <subquery>

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

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/254826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu18.04 64 位安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

进入VirtuakBox官网&#xff0c;网址链接&#xff1a;Oracle VM VirtualBoxhttps://www.virtualbox.org/ 网页连接&#xff1a;Ubuntu Virtual Machine Images for VirtualBox and VMwarehttps://www.osboxes.org/ubuntu/ 将下发的ds_db01.sql数据库文件放置mysql中 12、编写S…

19 高速列车场景下3Gpp 5G NR的DMRS设计与评估

文章目录 解决问题设计DMRS仿真参数仿真结果 解决问题 多普勒/扩展影响十分显著&#xff0c;设计用于信道估计时&#xff0c;需要考虑解调参考信号&#xff0c;5G用DMRS结构而不是CRS结构&#xff0c;因此需要为高速UE设计DMRS结构&#xff0c;DMRS设计是为了提高信道估计并减…

jdk多版本切换环境变量管理(jdk1.8和jdk17)

jdk多版本切换环境变量管理&#xff08;jdk1.8和jdk17&#xff09; 看了很多网上的博客&#xff0c;根本都不行&#xff0c;我总结出来规律如下&#xff1a; 首先环境变量要配置成这个样子&#xff1a;这些博客都会教你们配 接着配什么classpath&#xff0c;看其他博客就行 还…

百度地图添加坐标点,并返回坐标信息

1、创建地图容器 在mounted中初始化地图、鼠标绘制工具和添加鼠标监听事件 vue data中添加地图和绘制工具对象 2、添加初始化化地图方法 initMap(longitude, latitude) {let that thisthat.map new BMapGL.Map("container");// 创建地图实例if (longitude null ||…

亿某通电子文档安全管理系统任意文件上传漏洞 CNVD-2023-59471

1.漏洞概述 亿某通电子文档安全管理系统是一款电子文档安全防护软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产。亿赛通电子文档安全管理系统UploadFileFromClientServiceForClient接口处存在任意文件…

大创项目推荐 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

2024年【建筑电工(建筑特殊工种)】报名考试及建筑电工(建筑特殊工种)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年建筑电工(建筑特殊工种)报名考试为正在备考建筑电工(建筑特殊工种)操作证的学员准备的理论考试专题&#xff0c;每个月更新的建筑电工(建筑特殊工种)新版试题祝您顺利通过建筑电工(建筑特殊工种)考试。 1、【单…

内网离线搭建之----nginx高可用

1.系统版本 虚拟机192.168.9.184 虚拟机192.168.9.185 2.nginx以及依赖下载地址 nginx&#xff1a;nginx: download pcre&#xff1a;PCRE - Browse /pcre/8.45 at SourceForge.net zlib&#xff1a;zlib Home Site 基本都在置顶的资源里 3.检查环境安装依赖的依赖&#xf…

RS232转profinet网关扫码枪自由口与1500程序对比

RS232转profinet网关&#xff08;XD-PNR200&#xff09;自由口是一种用于将RS232串口信号转换为profinet协议的设备&#xff0c;它具有自由口的功能。本文以某自动化生产线为例进行案例研究。通过RS232转Profinet网关&#xff08;XD-PNR200&#xff09;&#xff0c;将生产线的多…

Elasticsearch 【版本7.X】之常用的语法大全

文章目录 监控相关 API 查看健康状况查看所有节点查看所有节点详细信息查看主节点查看所有索引查看所有分片 索引管理 创建索引查看索引查看索引字段类型修改索引字段删除索引别名 给索引添加别名查询某个索引下的别名给索引更换别名给索引解绑别名一个别名绑定多个索引查询ind…

xv6 文件系统(上)

〇、前言 本文将会结合 xv6 源码讨论文件系统的工作原理。 一、文件系统实现概述 xv6 文件系统可以用下面的图来表示&#xff1a; 按照分层的方式进行理解&#xff1a; 在最底层是磁盘&#xff0c;也就是一些实际保存数据的存储设备&#xff0c;正是这些设备提供了持久化存…

mysql函数()之常见字符串函数

MySQL中常见的字符串函数有以下几种&#xff1a; CONCAT()&#xff1a;将两个或多个字符串连接在一起。 用法&#xff1a;CONCAT(string1, string2, …) 效果图&#xff1a; LENGTH()&#xff1a;返回字符串的长度。 用法&#xff1a;LENGTH(string) 效果图&#xff1a; UP…

7款不容错过的前端特效源码分享(附源码及演示效果)

分享7款非常不错炫酷的前端特效源码 其中包含css动画特效、js原生特效、svg特效等 下面我会列出核心的代码 但你也可以点击预览获取查看该源码的最终展示效果及下载该源码资源 图像网格动画 纯js和css实现的多方位多样式的图像网格动画 点击预览获取 核心代码 <div class…

基于JSP+Servlet+JavaBean+JDBC+DAO的Web架构设计图书管理系统

系统实现如下的基本管理功能: (1)用户分为两类:系统管理员&#xff0c;一般用户。 (2)提供用户注册和用户登录验证功能:其中一个登录用户的信息有:登录用户名&#xff0c;登录密码。 (3)管理员可以实现对注册用户的管理(删除)&#xff0c;并实现对图书的创建、查询、修改和删…

Java算法(十二):【数据结构与算法】 十大排序 之 二分查法 二分查法实现详细流程图分析 实现源码实例

二分查找 二分查找 二分查找就是返回有序序列中&#xff0c;需要查找的元素索引&#xff0c;无则-1。 需求&#xff1a;二分查找&#xff1a;手写实现数组元素的查找&#xff0c;存在返回索引&#xff0c;无则返回 -1&#xff1b;实现思路&#xff1a;&#xff08;前提是有序…

“源味河南县 牛羊天下鲜”河南县有机农畜产品发布会在博鳌召开

2023年12月17日&#xff0c;由中共青海省黄南州河南蒙古族自治县委员会、县人民政府主办的“源味河南县 牛羊天下鲜”绿色有机农畜产品发布会在海南博鳌举办。原农业部党组成员、中国农产品市场协会会长张玉香&#xff0c;原农业部党组成员、中国奶业协会战略发展委员会名誉副主…

VueStu03-插值表达式

插值表达式是 vue 的一种模板语法。 语法&#xff1a;{{ 表达式 }} 总结&#xff1a;

材料论文阅读/中文记录:Scaling deep learning for materials discovery

Merchant A, Batzner S, Schoenholz S S, et al. Scaling deep learning for materials discovery[J]. Nature, 2023: 1-6. 文章目录 摘要引言生成和过滤概述GNoME主动学习缩放法则和泛化 发现稳定晶体通过实验匹配和 r 2 S C A N r^2SCAN r2SCAN 进行验证有趣的组合家族 扩大…

WEB渗透—PHP反序列化(四)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

日本服务器:确保其稳定性的几个要点

​  在租用日本服务器时&#xff0c;用户们大多一定会关注它的稳定性&#xff0c;其实这些顾及都是正常的。毕竟&#xff0c;网站要想正常运行&#xff0c;保障服务器稳定是关键。本文将讨论有关如何保障日本服务器稳定性的一些有用技巧&#xff0c;希望对您有所帮助。 1.注重…