暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库内核miniToadb】第54天 从SQL到内核:子查询的5大类型与语法解析原理深度剖析

开源无限 2025-03-02
12

作者在数据库内核设计从业十余年;设计开发分布式数据内核;编写从零手写数据库教程;现在将过去的数据库内核经验一一分享,有兴趣的朋友加个关注。

一、概述 


在实际使用中,常常同时会处理多张表的数据,处理时存在递进关系,比如从两表的查询结果中,再进一步与其它表一起处理。

一种就是将前一步的结果记录到临时表中,再执行第二步;

不过当前数据库SQL也支持将前一步作为一个子查询,嵌套在后一步的SQL中,这样就可以在一条SQL中完成复杂的关系处理。

二、子查询的基本概念 


子查询(Subquery)是嵌套在另一个查询(主查询)中的查询语句,根据其作用位置和返回结果类型可分为:

  1. 标量子查询:返回单个值(一行一列),常用于 SELECT
    WHERE
     或 HAVING
     子句。

例如:其中的count(*)统计结果。

SELECT name, (SELECT COUNT(*) FROM orders WHERE user_id = u.id) AS order_count  
FROM users u;  

2. 行子查询:返回一行多列,通常与行比较运算符(如 = ANY
)配合使用。

3. 表子查询:返回多行多列,常用于 FROM
 子句或 IN
 条件,作为中间结果集来使用。

例如:

SELECT * FROM products  
WHERE price > (SELECT AVG(price) FROM products);  

4. 相关子查询:依赖主查询的上下文(引用主查询的列),逐行执行。
SELECT name FROM users u  
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);  

5. 非相关子查询:独立于主查询,仅执行一次。

三、子查询的语法解析 


子查询可以在select子句,from子句,还可以是where子句,目前语法规则只支持from子句,其它两种情况后面继续再添加。

table_info: 
        | '(' select_stmt ')' alias_opt    
                {
                }
    ;

在from子句的数据表语法规则中增加一条嵌套子查询的规则,子查询也相当于一个临时数据表,递归的从查询命令又开始解析。

这里子查询一般会进行重命名,方便在where子句中引用它的属性列。

四、总结 


本节内容在sqlgram.y文件中修改,位于exam_41目录下。

【手写数据库内核miniToadb】第53天 JOIN联接子句的语法解析规则

【手写数据库内核miniToadb】第52天 表达式子句的语法解析

【手写数据库内核miniToadb】第51天 SELECT命令的主干语法规则


文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论