首先先定义一个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:数据填的不太好,最后两步没体现出来,但就是这么个意思,不要在意这些细节。。。