码迷,mamicode.com
首页 > 数据库 > 详细

SQL语句的执行顺序--知道执行顺序,顺便可以做优化了,对吧

时间:2018-10-09 21:48:45      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:一个   数据表   --   计算   from   nbsp   关联   排序   查看   

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

SQL语句的执行顺序--知道执行顺序,顺便可以做优化了,对吧

标签:一个   数据表   --   计算   from   nbsp   关联   排序   查看   

原文地址:https://www.cnblogs.com/coisini/p/9762769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!