sql语句中 select from where group by having order by 的执行顺序
其中select 和from 是必须的,其他关键字是可选的,这六个关键字执行顺序如下:
from–where–group by–having–select–order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by :如何将上面过滤出的数据分组
having: 对上面已经分组的数据进行过滤的的条件
select:查看结果集中的哪个列,或列的计算结果
order by:按照什么样的顺序来查看返回的数据
from子句-执行顺序为从后往前,从右到左:
from子句中写在最后的表将被最先处理,最后的表为基础表,在from子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。
如果有3个以上的表连接查询,就选择交叉表,作为基础表,交叉表指的是被其他表所引用的表。
where子句的执行顺序为自下而上,从右到左:
可以过滤掉最大数量记录的条件必须写到where子句的末端
group by执行顺序从左到右分组
提高group by 语句的效率,可以通过将不需要的记录在group by 之前过滤掉。即在group by 前使用where来过滤,尽量避免group by 后再having过滤
having子句-很耗资源,尽量少用
尽量避免使用having子句,having只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序,总计等操作。
如果where子句在group by 前限制记录的数目,就能减少这方面的开销。
on,where,having 这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,速度应该是最快的。
where 也应该比having 快点的,因为它过滤数据后才进行sum,在两个表联接时才用on 的,所以在一个表的时候,就剩下where 跟having比较了。
在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where 可以使用rushmore 技术,而having 就不能,在速度上后者要慢。
如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,where 的作用时间是在计算之前就完成的,而having 就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。
在多表连接查询时,on 比where更早起作用。系统首先根据各个表之间的连接条件,把多个表合成一个临时表,再由where进行过滤,然后再计算,计算后再有having进行过滤
select子句-少用*号,尽量取字段名称
在解析sql语句中,会将依次转换成所有的列名,这个工作是通过查询数据字典来完成的,使用列名意味着减少查询时间。
order by 子句 -执行顺序从左到右,排序,很耗资源
举例:
select 考生姓名, max(总成绩) as max总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩) > 600
order by max总成绩
执行顺序:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 “学生姓名” 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用,感谢网友 zyt1369 提出这个问题)
(4). 计算 max() 聚集函数, 按 “总成绩” 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 “Max 成绩” 进行排序.
’