SQL查询语句分步详解------HAVING命令

HAVING命令:

1.书写顺序:

              HAVING命令不能独立出现在查询语句中,只能出现在GROUP BY 后面。

              SELECT 字段名,函数名,子查询

              FROM 表名

              WHERE 数据行定位判断

              GROUP BY 分组字段1,分组字段2

              HAVING 通过统计临时表信息决定是否删除哪些临时表

 

2.执行顺序:

              FROM-->WHERE-->GROUP BY-->HAVING-->SELECT

3.执行原理:

              having命令在group by之后执行的。负责将GROUP BY生成临时表中"不满足条件的临时表"从内存中删除掉。

4.七个查询命令中,只有having在执行完毕后不会生成全新临时表。

硬盘上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

需求:查看人数在5人以上部门

SQL:  select

                 deptno,count(*)

          from

                 emp

          group by

                 deptno

          having

                 count(*) >= 5

第一步:执行  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

           对第一个临时表中DEPTNO字段下的内容进行统计,发现有三个不同的数据(分别是10、20和30),此时就会把都是10的数据行保存到一个新的临时表中;把都是20的数据行保存到另一个新的临时表中;再把都是30的数据行也保存到一个新的临时表中。这样就会生成三个新的临时表,这三个新临时表生成后由FROM命令生成的第一个临时表就会被销毁。

第二个临时表

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

第三步:执行 having count(*) >= 5

    执行这个命令的时候,因为第四个临时表中的count(*) = 3,不满足count(*) >= 5的条件,所以会将第四个临时表删除。为此该命令执行完毕后内存中就剩下了第二个临时表和第三个临时表。

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

           这里的SELECT命令操作的是多个表(本例中是两个表)为此SELECT读取的是每个表对应字段的第一个数据,然后将对应字段的数据合并在同一列中,COUNT(*)计算每个表中的数据行数。它们共同组成一个全新的临时表(第五个临时表),这时会将内存中第二个临时表和第三个临时表销毁。

第五个临时表

DEPTNO

count(*)

20

5

30

6

最后,由MySQL服务器将第五个临时表作为最终的结果推送给客户端,供操作者查阅。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值