今天,被面试问到了一个问题,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--终于开始新增了 算了不讲了,从左到右执行