今天,被面试问到了一个问题,SQL的执行顺序,当时想的是,SQL有啥执行顺序,从上往下?当时瞎胡邹,说先执行from,为啥,不执行from怎么知道操作查询的是什么表,对吧,哎嘿,还蒙对了。下来之后总结了一下
(一)先讲讲查询吧
查询语句中select from where group by having order by的执行顺序
1.查询中用到的关键词主要包含六个,并且他们的顺序依次为
select--from--where--group by--having--order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序
与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
from--where--group by--having--select--order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据
2:解析顺序
from: 自右向左解析(数据量大的,放在最右边)
where:自下而上(能过滤掉大量数据的条件放在下边)
3:子句
from 子句 --执行顺序为从后往前、从右到左,
最后边的表为驱动表,从后往前解析,作为驱动表,当然越快越好,所以数据量少的放在最后
where 子句 --执行顺序为自下而上、从右到左
可以过滤掉最大数量记录的条件必须写在Where 子句的末尾。
group by--执行顺序从左往右分组(一般都是自右向左,这个较为特殊,自左向右)
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。即在GROUP BY前使用 WHERE来过虑,而尽量避免GROUP BY后再HAVING过滤。
having 子句----很耗资源,尽量少用
避免使用having子句,为什么呢,因为他需要检索出所有记录后对结果集进行过滤,这个过程包括了排 序和总计操作,所以效率低
order by子句--执行顺序为从左到右排序,很耗资源(一般都是自右向左,这个较为特殊,自左向右)
4:on、where、having
执行顺序是on、where、having
1)多表联查,eg:tabA、tabB
select a.column1, b.columnB from tabA a,tabB b
on a.a_id = b.b_id
where
省略
having
多表联查的时候才用到on,联查的话肯定表要先关联呀,所以,就会先执行on
having本来就是在where执行后,获得的结果集再进行过滤,所以,先where在having
(二)讲一下update
1:节点执行顺序是先update节点where再set修改多个字段时,是从左到右的顺序
eg:update studentset column1 = ‘aa’,column=‘bb’
where colunb_id = 10;
肯定先执行呀,--不执行update,你怎么知道操作哪个表哦
再where,--筛选出,要操作的记录
然后set,--都查出来了,最后做修改
2:where后多条件
eg:update student set column1 = ‘aa’,column=‘bb’
where colunb_i = 10 and sex = ‘女’
上面不是讲了吗,where子句执行顺序是先下后上,所以会先找性别为女的,再找班级为3的,根据你的实际情况,看先执行哪个条件可以先过滤掉大量数据,就写在下边,效率高点
(三)讲delete咯-- 不讲了,参考(二)
1:删除条件只有一个
eg: delete from student where class_id = '3'
2:删除条件不止一个
delete from student
where
class_id = '3'
and
sex = ‘女’
(四)insert--终于开始新增了
算了不讲了,从左到右执行