多字段分组规则:

1.多字段分组时,分组字段出现顺序对于最终查询结果没有任何影响的。

group by deptno,job 与 group by job,deptno查询最终结果是一致的

2.多字段分组时,GROUP BY一次只能根据一个分组字段进行分组

GROUP BY DEPTNO,JOB ,此时GORUP BY需要执行两次

3.多字段分组时,从第二个分组字段开始,操作的是上一个分组字段生成的临时表。

GROUP BY DEPTNO,JOB.当执行group by job时,操作的临时表是由group by deptno生成的。

硬盘上EMP.frm

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

1980/12/17

800

NULL

20

7499

ALLEN

SALESMAN

7698

1981/2/20

1600

300

30

7521

WARD

SALESMAN

7698

1981/2/22

1250

500

30

7566

JONES

MANAGER

7839

1981/4/2

2975

NULL

20

7654

MARTIN

SALESMAN

7698

1981/9/28

1250

1400

30

7698

BLAKE

MANAGER

7839

1981/5/1

2850

NULL

30

7782

CLARK

MANAGER

7839

1981/6/9

2450

NULL

10

7788

SCOTT

ANALYST

7566

1987/4/19

3000

NULL

20

7839

KING

PRESIDENT

1981/11/17

5000

NULL

10

7844

TURNER

SALESMAN

7698

1981/9/8

1500

0

30

7876

ADAMS

CLERK

7788

1987/5/23

1100

NULL

20

7900

JAMES

CLERK

7698

1981/12/3

950

NULL

30

7902

FORD

ANALYST

7566

1981/12/3

3000

NULL

20

7934

MILLER

CLERK

7782

1982/1/23

1300

NULL

10

需求:查询每个部门下各个职位的人数

SQL:  SELECT

DEPTNO,JOB,COUNT(*)

FROM

EMP

GROUP BY

DEPTNO,JOB #多字段分组(当前分组字段是两个分别是:DEPTNO和JOB)

第一步:执行FROM EMP

该命令的执行会在内存中生成一个与源表一样的临时表(第一个临时表)

第一个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

1980/12/17

800

NULL

20

7499

ALLEN

SALESMAN

7698

1981/2/20

1600

300

30

7521

WARD

SALESMAN

7698

1981/2/22

1250

500

30

7566

JONES

MANAGER

7839

1981/4/2

2975

NULL

20

7654

MARTIN

SALESMAN

7698

1981/9/28

1250

1400

30

7698

BLAKE

MANAGER

7839

1981/5/1

2850

NULL

30

7782

CLARK

MANAGER

7839

1981/6/9

2450

NULL

10

7788

SCOTT

ANALYST

7566

1987/4/19

3000

NULL

20

7839

KING

PRESIDENT

1981/11/17

5000

NULL

10

7844

TURNER

SALESMAN

7698

1981/9/8

1500

0

30

7876

ADAMS

CLERK

7788

1987/5/23

1100

NULL

20

7900

JAMES

CLERK

7698

1981/12/3

950

NULL

30

7902

FORD

ANALYST

7566

1981/12/3

3000

NULL

20

7934

MILLER

CLERK

7782

1982/1/23

1300

NULL

10

第二步:执行 GROUP  BY  DEPTNO

1. 对第一个临时表DEPTNO字段下数据种类进行统计(当前临时表中DEPTNO字段下有3个不同的数据,分别是10、20和30,为此该命令执行完成后就会生成3个临时表)。

2. 将具有相同特征的数据行保存到同一个临时表。这些临时表全部生成后,前面由WHERE命令生成的临时表

(这里是第二个临时表)就会被销毁。

第二个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

1980/12/17

800

NULL

20

7566

JONES

MANAGER

7839

1981/4/2

2975

NULL

20

7788

SCOTT

ANALYST

7566

1987/4/19

3000

NULL

20

7876

ADAMS

CLERK

7788

1987/5/23

1100

NULL

20

7902

FORD

ANALYST

7566

1981/12/3

3000

NULL

20

第三个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7499

ALLEN

SALESMAN

7698

1981/2/20

1600

300

30

7521

WARD

SALESMAN

7698

1981/2/22

1250

500

30

7654

MARTIN

SALESMAN

7698

1981/9/28

1250

1400

30

7698

BLAKE

MANAGER

7839

1981/5/1

2850

NULL

30

7844

TURNER

SALESMAN

7698

1981/9/8

1500

0

30

7900

JAMES

CLERK

7698

1981/12/3

950

NULL

30

第四个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7782

CLARK

MANAGER

7839

1981/6/9

2450

NULL

10

7839

KING

PRESIDENT

1981/11/17

5000

NULL

10

7934

MILLER

CLERK

7782

1982/1/23

1300

NULL

10

第三步:执行 group by job

该命令操作第二步生成三个临时表,需要依次对三个临时表在进行拆分

1.对每个临时表中的JOB字段下的数据进行统计,

第二个临时表JOB字段下有三个不同的数据(分别是:CLERK、MANAGER和ANALYST),为此第二个临时表会生成三个       全新的临时表,新的临时表生成后,第二个临时表就会被销毁。

第三个临时表JOB字段下也有三个不同的数据(分别是:SALESMAN、MANAGER和CLERK),为此第三个临时表也会生成三个全新的临时表,新的临时表生成之后,第三个临时表被销毁。

同样的原理,第四个临时表也会生成三个全新的临时表,新的临时表生成之后,第四个临时表被销毁。

由第二个临时表生成的第五个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

1980/12/17

800

NULL

20

7876

ADAMS

CLERK

7788

1987/5/23

1100

NULL

20

由第二个临时表生成的第七个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7566

JONES

MANAGER

7839

1981/4/2

2975

NULL

20

由第二个临时表生成的第七个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7788

SCOTT

ANALYST

7566

1987/4/19

3000

NULL

20

7902

FORD

ANALYST

7566

1981/12/3

3000

NULL

20

由第三个临时表生成的第八个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7499

ALLEN

SALESMAN

7698

1981/2/20

1600

300

30

7521

WARD

SALESMAN

7698

1981/2/22

1250

500

30

7654

MARTIN

SALESMAN

7698

1981/9/28

1250

1400

30

7844

TURNER

SALESMAN

7698

1981/9/8

1500

0

30

由第三个临时表生成的第九个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7698

BLAKE

MANAGER

7839

1981/5/1

2850

NULL

30

由第三个临时表生成的第十个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7900

JAMES

CLERK

7698

1981/12/3

950

NULL

30

由第四个临时表生成的第十一个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7782

CLARK

MANAGER

7839

1981/6/9

2450

NULL

10

由第四个临时表生成的第十二个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7839

KING

PRESIDENT

1981/11/17

5000

NULL

10

由第四个临时表生成的第十三个临时表

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7934

MILLER

CLERK

7782

1982/1/23

1300

NULL

10

第四步:执行 SELECT DEPTNO JOB COUNT(*)

由于SELECT 操作的临时表是由group by提供的多个临时表,SELECT将依次对每个临时表进行操作,它是读取相应字段下的第一个数据,将它们对应的字段合并成一列保存到一个新的临时表中。

DEPTNO

JOB

COUNT(*)

10

MANAGER

1

10

PRESIDENT

1

10

CLERK

1

20

CLERK

2

20

MANAGER

1

20

ANALYST

2

30

SALESMAN

4

30

MANAGER

1

30

CLERK

1

全新的临时表生成之后,由group by命令生成的所有临时表都会被销毁,最后MySQL服务器将最后生成的临时表推送给客户端,供操作者查阅。

SQL查询语句分步详解——多字段分组查询相关推荐

  1. SQL查询语句分步详解——SELECT...FROM...WHERE...GROUP BY...

    GROUP BY : 分组查询命令 1.书写顺序: SELECT 字段名,函数,子查询 FROM 表名 WHERE 定位数据行条件 GROUP BY 分组字段 2.执行顺序: FROM-->WH ...

  2. SQL查询语句 select 详解

    查询select: 1.单表查询 2.多表查询 3.嵌套查询分类 1)单表查询 2)多表查询 A.连接查询 B.子查询 ①一般子查询 ②相关子查询*************************** ...

  3. Elasticsearch(es) 查询语句语法详解

    Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格式的对象,称之为 Query DSL.Elasticsearch 查询分类大致分为全文查询.词项查询.复合查 ...

  4. 分析查询语句 EXPLAIN 详解

    EXPLAIN 详解 一.概述 1.1.概述 二.基本语法 三.数据准备 1. 建表 2. 设置参数 log_bin_trust_function_creators 3. 创建函数 4. 创建存储过程 ...

  5. 玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

    sql语句group by使用详解 group by的基本语法 基本语法 什么是分组查询(一个字段) 多个字段的分组查询 1.两个字段的分组查询 2.三个字段及N个字段进行分组查询 having子句的 ...

  6. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接

    用两个表(t_worker,t_depart),关联字段t_worker.deptno和t_depart.deptno来演示一下MySQL的等值连接.左连接.右连接.全连接.数据库表:t_worker ...

  7. mysql 分组查询 语句_详解MySQL中的分组查询与连接查询语句

    分组查询 group bygroup by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达 ...

  8. MySQL查询语句(select)详解

    1.查询记录 select*from 表名 [where 条件];eg:select*from students;//查询 students 表中所有记录,所有字段的值都显示出来select fiel ...

  9. 数据分析 | SQL基础查询语句+例题详解

    SQL 语法结构:select--from--where--group by--having--order by--limit 运行顺序: from--where--group by--having- ...

最新文章

  1. 小白都能看懂的神经网络教程:从原理到优化如此简单
  2. Promise详解,相信你看完我这篇文章简单的Promise使用方式基本上就全会了
  3. flink写入iceberg(没有搞完)
  4. 鬼才项斌,用人工智能推动教育服务创新
  5. nifity scaffold gem
  6. 6还是5?大还是小?看完这些动图,感觉数学白学了
  7. 百度打造AIR智能道路系统,可降低90%交通事故
  8. java $表示什么_java – 变量名中$的含义是什么?
  9. 音乐播放器界面如何设计?
  10. Android实例-手机安全卫士(三十五)-来电号码显示归属地
  11. Londiste3 Install
  12. c语言中字母后面的 是什么意思,C语言中括号里面一个字母是什么意思
  13. 立即从iOS 10和macOS Sierra下载壁纸
  14. 金蝶KIS应用虚拟化集成解决方案
  15. JavaScript设计模式——观察者模式
  16. intel服务器cpu芯片线路图,Intel CPU路线图:14nm一直用到2021年
  17. java多线程学习笔记--一.多线程的基础知识
  18. 【模式识别】Boosting
  19. 基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩
  20. 30 款 IDEA 宝贝插件

热门文章

  1. goland-gopath
  2. 小米笔记本装linux教程视频教程,重新安装系统,小编教你小米笔记本怎么重装win10系统...
  3. 用Python实现自动化测试
  4. git之bitbucket
  5. 计算机等级考试一级在线模拟,全国计算机等级考试一级模拟试题1
  6. 58 同城移动端 Passport SDK 的设计与技术细节
  7. 简便计算机在线使用,计算器上的各个按键使用详解
  8. Python爬虫之知乎采集工具
  9. 计算机网络学习笔记(1)
  10. 使用graphicsmagick时gm命令被占用