基础的SQL执行顺序
SQL语句执行的时候是有一定顺序的。理解这个顺序对SQL的使用和学习有很大的帮助。
1.from
先选择一个表,或者说源头,构成一个结果集。
2.where
然后用where对结果集进行筛选。筛选出需要的信息形成新的结果集。
3.group by
对新的结果集分组。
4.having
筛选出想要的分组。
5.select
选择列。
6.order by
当所有的条件都弄完了。最后排序。
复杂的SQL执行顺序
- FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
- ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
- JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
- WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
- GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
- CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
- HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
- SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
- DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
- ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
- LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。
******************************以Left Join为例******************************
SQL语句中无论是否连接的其他表。 无论如何都要先形成一个结果集。后面的顺序不变!
只不过使用连接时,形成结果集合的方式略有不同。这个和 Left Join的实现原理有关。
select a.name,b.name
from T_left a //1
Left Join T_Right b //3
ON a.id = b.id //2
使用Left Join 形成结果集的方式是这样的。
1. 首先对From子句中的前两个表,执行笛卡尔积运算。运算结果 形成一个结果集合。
2. ON按条件,对上边的结果集,进行筛选,形成新的结果集。
3. 以左连接为例,如果T_left中存在未匹配到的行。那么把T_left中的这几行以外部行的形式加到上边的结果集中形成新的结果集。
4. 如果存在多张表,重复1~3过程!