数据库的语句执行顺序(必看)
来源:互联网 发布:云计算架构师要求 编辑:程序博客网 时间:2024/05/21 06:16
Author:王勤为
1.问题:如下2条语句的具体执行顺序是什么呢,有什么区别,哪条语句效率更高?
(1).select * from tb1 a join tb2 b on a.id=b.idwhere a.time between t11 and t12 and b.time between t21 and t22
(2).select * from (select * from tb1 where time between t11 and t12) a
join (select * from tb2 where time between t21 and t22) b on a.id=b.id
2.答案:有区别,第二条是先筛选后连接,在数据量很大而且没有索引的情况下,第二条语句的效率更高,如果有索引,请查看具体执行计划再做决定。
3.具体请看一个完整的SQL语句是怎么执行的吧
执行顺序:
(1). FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。
(2). ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
(3). OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到
处理完所有的表为止。
(4). 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。
(5). GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。
(6). CUBE|ROLLUP:把超组插入VT5,生成VT6。
(7). HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。
(8). SELECT:处理SELECT列表,产生VT8。
(9). DISTINCT:将重复的行从VT8中移除,产生VT9。
(10). ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。
(11). TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
0 0
- 数据库的语句执行顺序(必看)
- 关于sql和MySQL的语句执行顺序(必看!!!)
- 关于sql和MySQL的语句执行顺序(必看!!!)
- 数据库语句执行顺序
- SQL语句的执行顺序
- select语句的执行顺序
- select语句的执行顺序
- SQL语句的执行顺序
- MySQL的语句执行顺序
- SELECT语句的执行顺序
- SQL语句的执行顺序
- for语句的执行顺序
- SQL语句的执行顺序
- SQL语句的执行顺序
- sql语句的执行顺序
- 赋值语句的执行顺序
- sql语句的执行顺序
- SQL语句的执行顺序
- 重新组织函数--Inline Method(内联函数)
- Hadoop文件的基本操作
- sp2-0734:未知的命令开头'imp 忽略了剩余行
- 带着被缚的翅膀飞行
- LeetCode | Linked List Cycle II
- 数据库的语句执行顺序(必看)
- C++算法之 合并两个有序链表
- ROS服务和客户端
- 0099 Java设计模式--策略模式Context的必要性【进阶】
- 亚马逊大数据云会议上遗漏的一件事
- 剑指offer系列源码-矩形覆盖
- JQ方法大全
- git 的使用
- 理解viewport与device-width