有人说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语句全部执行完毕,系统自动将上面临时表显示在客户端

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

    

说说我对SQL语句执行顺序的理解,以SQL Server为例的更多相关文章

  1. Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...

  2. sql 语句执行顺序

    一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图 ...

  3. 整理:sql server 中sql语句执行顺序

    SQL Server 查询处理中的各个阶段(SQL执行顺序) SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是 ...

  4. sql语句执行顺序与性能优化(1)

    一.首先我们看一下mysql的sql语句的书写顺序 . select--distinct--from--on--where--group by--having--聚合函数cube.rollup--or ...

  5. hive sql 语句执行顺序及执行计划

    hive 语句执行顺序 from... where.... select...group by... having ... order by... 执行计划 Map Operator Tree: Ta ...

  6. Oracle sql语句执行顺序(转)

    from: http://blog.csdn.net/lailai186/article/details/12612263 sql语法的分析是从右到左 一.sql语句的执行步骤:1)语法分析,分析语句 ...

  7. SQL Server SQL语句执行顺序

    执行顺序: 1.FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1 2.ON:对vt1表应用ON筛选器只有满足 为真的行才被插入vt2 3.OUTER(join):如果指定了 OUTER ...

  8. <转>SQL语句执行顺序说明

    原文地址:http://www.cnblogs.com/summer_adai/archive/2011/10/28/2227605.html SQL 不同于与其他编程语言的最明显特征是处理代码的顺序 ...

  9. EF生成的SQL语句执行顺序问题。

    //实体被更改后,再做删除,EF只生成删除语句 //实体删除后再更改,EF报错 //添加语句会再,更改,删除后执行,更AddObject位置无关 //一个实体多个字段被改,只会生成一句update / ...

随机推荐

  1. 吴裕雄--天生自然Numpy库学习笔记:NumPy 副本和视图

    副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置. 视图是数据的一个别称或引用,通过该别称或引用亦便可访问.操作原有数据,但原有数据不会产生拷贝.如果我们 ...

  2. base64相关

    1.base64指定的64个字符(包含52个大小写.10个数字和+./): abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ...

  3. java之md5加密算法

    /** * @author * */ public class MD5 { private static final String[] digital = { "0", " ...

  4. sql server alter column identity

    上网找 alter column identity 语句,将表中的一个字段调整成自动新增.发现没有. 跟踪了一下sql server 执行这一动作的语句,发现是新建了新表,将字段修改成自动新增,然后将 ...

  5. 学习 Python,怎能不懂点PEP 呢?

    或许你是一个初入门 Python 的小白,完全不知道 PEP 是什么.又或许你是个学会了 Python 的熟手,见过几个 PEP,却不知道这玩意背后是什么.那正好,本文将系统性地介绍一下 PEP,与大 ...

  6. 数字反转(0)<P2011_1>

    数字反转  (reverse.cpp/c/pas) [问题描述] 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形 式,即除非给定的原数为零,否则反转后得到的新数的最高位数 ...

  7. 4.ORM框架的查询

    创建表对应关系代码如下: from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app=Fl ...

  8. poj1988 Cube Stacking(并查集

    题目地址:http://poj.org/problem?id=1988 题意:共n个数,p个操作.输入p.有两个操作M和C.M x y表示把x所在的栈放到y所在的栈上(比如M 2 6:[2 4]放到[ ...

  9. selenium webdriver 操作select

    @Test public void test() { WebDriver driver=ExplorerBase.IESetting(); driver.get("http://unique ...

  10. python 基础之深浅拷贝

    深浅拷贝 s=[[1,2],'fgfgf','cx'] s3=s.copy() print(s) print(s3) 测试 D:\python\python.exe D:/untitled/dir/f ...