zoukankan      html  css  js  c++  java
  • SQL语句的执行顺序--知道执行顺序,顺便可以做优化了,对吧

    今天,被面试问到了一个问题,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--终于开始新增了
        算了不讲了,从左到右执行
  • 相关阅读:
    java注解
    Mac窗口管理管理软件SizeUp
    mac下8080端口到80端口的转发
    mac svn的替代品CornerStone
    模板模式讲解二
    数组和集合List的相互转化
    fastjson使用示例
    模板模式讲解一
    mybatis-generator-core自动生成do、mapping、dao 代码
    maven依赖传递关系
  • 原文地址:https://www.cnblogs.com/coisini/p/9762769.html
Copyright © 2011-2022 走看看