Sql的执行顺序,
- From
from对需要查询的表进行笛卡尔乘积,得到虚拟的表VT1
- Join
对虚拟表VT1应用On筛选器,只有为真的才会被插入到虚拟表VT2
- On
如果是外连接,把第二步中主表过滤掉的数据进行保留(也就是无论如何,外连接的主表中的数据,在这一步都会是全部数据,所以我们如果想对主表进行筛选,其实这里影响的只是VT2中不满足条件的行数据中,从表的值变为null),从VT2表中把过滤掉的数据的从表的列的值赋予NULL,并生成表VT3
注意:如果存在多个表的连接,则重复以上步骤,也就是连接两个表后,进行ON的筛选,再用结果表和下一张表进行连接筛选,多表连接注意null的处理
内连接时,因为ON后面是满足两张表的条件,所以在内连接时,条件写在ON后面会减少临时表中数据的条数,会更快一点
- Where
对虚拟表VT3(满足连接条件后的结果)应用WHERE条件筛选器,根据指定条件进行筛选,并把满足条件的插入表VT4
注意:1.由于这里还没有执行SELECT,所以不能使用列的别名
2.由于还没有执行分组,Group by 所以聚合函数在这里也不能被执行
- Group by
这里进行分组,分组的条件使得同一个组中,所有的原有数据的分组条件都是一致的,所以此时是对组中除条件外的列进行聚合函数的计算,生成虚拟表VT5
注意:这一步后可以使用SELECT中的别名(可以理解为这一步先把所有的列先查询出来,后面的SELECT再进行筛选)
- Avg,sum 等聚合函数
函数一般包括
AVG:返回平均值
COUNT:返回行数
FIRST:返回第一个记录的值
LAST:返回最后一个记录的值
MAX:返回最大值
MIN:返回最小值
SUM:返回总和
- Having
和where是相同的功能,都是筛选数据,不过它是对分组过后的聚合完的列的值进行删选,因为WHERE和聚合函数不能一起使用,并生成虚拟表VT6
- Select
进行需要的字段的筛选,并进行字段的表达式的处理,如IF(),并产生虚拟表VT7
- Distinct
去除重复的行,只保留唯一的,并产生虚拟表VT8
- Order by
它不是生成虚拟表,只是相当于生成游标,标记某一条数据的排序位置
- Limit
限制生成的行数,生成虚拟表VT9,返回给调用者