MySQL-- executeSequence

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 成绩” 进行排序.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值