SQL语句执行顺序(MySQL)
2016-03-14 20:58
956 查看
首先先定义一个sql语句如下:
在这些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:数据填的不太好,最后两步没体现出来,但就是这么个意思,不要在意这些细节。。。
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:数据填的不太好,最后两步没体现出来,但就是这么个意思,不要在意这些细节。。。
相关文章推荐
- MySQL基本命令 (二)
- MYSQL查询优化
- MySQL安装配置教程
- mysql插入返回当前生成的主键
- MySQL闪退问题的解决
- MySql 唯一键
- MySQL命令介绍
- MySQL学习笔记7(查询数据)
- 构建Mysql连接池
- mysql 数据库设置中文输入
- 浅谈MySQL存储引擎选择 InnoDB还是MyISAM
- mysql create trigger and procedure demo
- mysql 查询优化
- MySQL 5.5升级5.6 单实例操作
- Mysql性能测试诊断
- MyBatis+MySQL 返回插入的主键ID
- 源码安装 mysql 5.5.20升级到mysql 5.6.25
- 升级mysql_upgrade 提示错误FATAL ERROR: Upgrade failed的原因
- MySQL数据库导出数据
- mysql中的隐式转换