作者在数据库内核设计从业十余年;设计开发分布式数据内核;编写从零手写数据库教程;现在将过去的数据库内核经验一一分享,有兴趣的朋友加个关注。
一、概述
在实际使用中,常常同时会处理多张表的数据,处理时存在递进关系,比如从两表的查询结果中,再进一步与其它表一起处理。
一种就是将前一步的结果记录到临时表中,再执行第二步;
不过当前数据库SQL也支持将前一步作为一个子查询,嵌套在后一步的SQL中,这样就可以在一条SQL中完成复杂的关系处理。
二、子查询的基本概念
子查询(Subquery)是嵌套在另一个查询(主查询)中的查询语句,根据其作用位置和返回结果类型可分为:
标量子查询:返回单个值(一行一列),常用于 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);
SELECT name FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
三、子查询的语法解析
子查询可以在select子句,from子句,还可以是where子句,目前语法规则只支持from子句,其它两种情况后面继续再添加。
table_info:
| '(' select_stmt ')' alias_opt
{
}
;
在from子句的数据表语法规则中增加一条嵌套子查询的规则,子查询也相当于一个临时数据表,递归的从查询命令又开始解析。
这里子查询一般会进行重命名,方便在where子句中引用它的属性列。
四、总结
本节内容在sqlgram.y文件中修改,位于exam_41目录下。
【手写数据库内核miniToadb】第53天 JOIN联接子句的语法解析规则
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




