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在执行完毕后不会生成全新临时表。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
需求:查看人数在5人以上部门 SQL: select deptno,count(*) from emp group by deptno having count(*) >= 5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第一步:执行 from emp 会将硬盘上的表文件读取到内存中,在内存中生成第一个临时表。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第二步:执行 group by deptno 对第一个临时表中DEPTNO字段下的内容进行统计,发现有三个不同的数据(分别是10、20和30),此时就会把都是10的数据行保存到一个新的临时表中;把都是20的数据行保存到另一个新的临时表中;再把都是30的数据行也保存到一个新的临时表中。这样就会生成三个新的临时表,这三个新临时表生成后由FROM命令生成的第一个临时表就会被销毁。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第三步:执行 having count(*) >= 5 执行这个命令的时候,因为第四个临时表中的count(*) = 3,不满足count(*) >= 5的条件,所以会将第四个临时表删除。为此该命令执行完毕后内存中就剩下了第二个临时表和第三个临时表。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第四步:执行SELECT DEPTNO,COUNT(*) 这里的SELECT命令操作的是多个表(本例中是两个表)为此SELECT读取的是每个表对应字段的第一个数据,然后将对应字段的数据合并在同一列中,COUNT(*)计算每个表中的数据行数。它们共同组成一个全新的临时表(第五个临时表),这时会将内存中第二个临时表和第三个临时表销毁。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
最后,由MySQL服务器将第五个临时表作为最终的结果推送给客户端,供操作者查阅。 |
SQL查询语句分步详解------HAVING命令
于 2023-01-09 07:24:01 首次发布