SQL语句执行顺序(MySQL)

首先先定义一个sql语句如下:

select distinct student.id,name,max(age),course 
from student left join course on student.id = course.stu_id
where student.id > 3
group by name having max(age) > 23 
order by age limit 1;

这里写图片描述
在这些SQL语句的每一步执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果。

1.将表student和表course进行笛卡尔积,形成虚拟表v1;

这里写图片描述
2.执行on连接条件,筛选出满足条件student.id = course.stu_id的虚拟表v2;

这里写图片描述
3.因为是left join 所以在步骤2 基础上添加student表的其余数据形成虚拟表v3;

这里写图片描述
4.执行where条件,筛选符合的条件形成虚拟表v4

这里写图片描述

在使用WHERE子句时,需要注意以下两点:
(1)由于还没执行group by,因此现在还不能在where中使用where xx=min(col)这类对分组统计的过滤;
这里写图片描述
(2)由于还没执行select,因此在select中使用列的别名也是不被允许的,如:
这里写图片描述
5.执行group by分组,形成虚拟表v5

这里写图片描述
6.执行select语句,执行聚集函数,最后执行distinct,形成虚拟表v6

这里写图片描述
7.执行having最后筛选,形成虚拟表v7

这里写图片描述
8.使用order by排序,形成虚拟表v8

这里写图片描述
9执行limit,最后形成结果表

这里写图片描述
ps:数据填的不太好,最后两步没体现出来,但就是这么个意思,不要在意这些细节。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值