zoukankan      html  css  js  c++  java
  • 说说我对SQL语句执行顺序的理解,以SQL Server为例

    有人说SQL语句难学,其实并不难!只要掌握了基本的语句执行顺序,用程序化的思维分析结构,再难的问题也会迎刃而解!

    假设有如下表emp

    现在要求 列出员工姓名(ename)中不含A的所有人按照部门编号(deptno)分组后,每个部门的平均工资大于2000的部门的编号、工资、人数

    分析上题,罗列出具体要求

      1.员工姓名(ename)中不含A

      2.将所有员工按照部门分组

      3.找出平均工资大于2000的所有部门

      4.列出部门编号、人数、平均工资

    如果分别解决这些问题,那么很简单

      1. select * from emp where ename not like '%A%'
    
      2. select deptno from emp group by deptno
    
      3. select deptno from emp group by deptno having avg(sal)>2000
    
      4. select deptno,count(*),avg(sal) from emp group by deptno

    接着考虑把步骤合在一块儿之前,必须了解sql语句的执行顺序

    SQL Select语句完整的执行顺序: 

    • 1、from子句组装来自不同数据源的数据;  
    • 2、where子句基于指定的条件对记录行进行筛选;  
    • 3、group by子句将数据划分为多个分组;  
    • 4、使用聚集函数进行计算;  
    • 5、使用having子句筛选分组; 
    • 6、计算所有的表达式;  
    • 7、使用order by对结果集进行排序。 

    如果放在SQL语句上,将这些步骤用SQL语句描述,则更加直观

    • (8)SELECT  (9)DISTINCT  (11)<TOP_specification> <select_list>  
    • --(1) FROM <left_table>  
    • --(3)    <join_type> JOIN <right_table>  
    • --(2)      ON <join_condition>  
    • --(4) WHERE <where_condition>  
    • --(5) GROUP BY <group_by_list>  
    • --(6) WITH {CUBE | ROLLUP}  
    • --(7) HAVING <having_condition>  
    • --(10) ORDER BY <order_by_list> 

    再回到题目

      列出员工姓名(ename)中不含A的所有人按照部门编号(deptno)分组后,每个部门的平均工资大于2000的部门的编号、工资、人数

    现在可以按照SQL语句处理思维,重新描述解决步骤,每个子句执行完毕都生成了一张临时表

      1.from子句定位到emp表

        from emp

        执行完这句,系统创建的临时表如下

        

      2.从上面的临时表中 筛选出所有ename中不包含A的

        from emp

        where ename not like '%A%'

        执行完,临时表变成了:

        

      3.再根据deptno对上面的临时表进行分组(为了便于理解,这里提前显示了部门编号 人数和平均工资)

        from emp

        where ename not like '%A%'

        group by deptno

        执行完这句,临时表变成了:

        

      4.再从上一张临时表中 找出平均工资大于2000的部门,并选择要显示那些列(部门编号 部门人数 部门平均工资)

        select deptno "部门编号",count(*) "部门人数",avg(sal) "部门平均工资"

        from emp

        where ename not like '%A%'

            group by deptno

            having avg(sal)>2000

         执行完这坨代码,临时表又变成了

         

      5.好了,到这里sql语句全部执行完毕,系统自动将上面临时表显示在客户端

       最终结果,也就是你看到的

        

  • 相关阅读:
    Python字符串前缀u、r、b、f含义
    Chrome文字识别插件:一键读图(OCR)
    GIT使用log命令显示中文乱码
    APP通用测试用例大全
    Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
    Python代码覆盖率工具coverage使用教程
    Python坑:不要使用可变对象作为函数默认值、生成器不保留迭代过后的结果、嵌套列表创建、==和is的区
    Appium元素定位方法
    你可能不知道的几个外挂浏览器脚本
    浏览器扩展插件(一)
  • 原文地址:https://www.cnblogs.com/hoosway/p/3554203.html
Copyright © 2011-2022 走看看