欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库之分组

程序员文章站 2022-03-04 19:02:28
概念 按照一定标准把数据分成若*分 语法 实际执行时先执行from s_emp 再执行group by dept_id 最后是统计输出select dept_id,count(id) 如何对组数据进行过滤 where是对表数据进行过滤的。 组数据过滤有特殊的语法——having having要加在 ......

概念

按照一定标准把数据分成若*分

数据库之分组

语法

from  表名
    where  条件
        group  by  分组标准
        (group标准的要写在where之后,没有where写在from之后)        

 

语句:select  dept_id,count(id)  from  s_emp  group  by  dept_id;
  • 实际执行时先执行from  s_emp
  • 再执行group by  dept_id
  • 最后是统计输出select  dept_id,count(id)

数据库之分组

 

如何对组数据进行过滤

  • where是对表数据进行过滤的。
  • 组数据过滤有特殊的语法——having
  • having要加在group后面

演示:按照部门号分组,统计每个部门的人数,显示人数大于2的部门并且按部门号降序排列

select dept_id, count(id) from s_emp group by dept_id having count(id)>2 order by dept_id desc;

数据库之分组

演示:按照部门号分组,统计每个部门的平均工资,显示平均工资大于1300的部门

select dept_id, avg(salary) from s_emp group by dept_id having avg(salary)>1300;

数据库之分组

 

在分组语句中,select后的字段要么是分组标准,要么是经过合适组函数处理过的内容

举例:按照部门号分组,统计每个部门的平均工资,显示平均工资大于1300的部门,还要显示部门名

数据库之分组

select dept_id, avg(salary), name from s_emp e, s_dept d where dept_id=d.id group by dept_id, name having avb(salary)>1300; 

数据库之分组

(存在一些问题)匹配显示次数问题

所以用组函数,因为组函数只会有一个结果, 如果用count:

select dept_id, avg(salary), count(name) from s_emp e, s_dept d where dept_id=d.id group by dept_id having avg(salary)>1300;

数据库之分组

 

如果用max:

select dept_id, avg(salary), max(name) from s_emp e, s_dept d where dept_id=d.id group by dept_id having avg(salary)>1300;

数据库之分组

 

因为可能会有的部门没有对应部门名,数据会丢失,则要全部显示部门表的内容,所以还要加上外连接。

select dept_id, avg(salary), count(name) from s_emp e, s_dept d where dept_id=d.id(+) group by dept_id having avg(aslary)>1300;

数据库之分组

 sql语句的执行顺序

(1)from   先找到要操作的表

(2)where  会有过滤条件

(3)group  by  分组肯定在having之前

(4)having   对组数据进行过滤  通过下面举例的别名可以确定having和select的执行顺序

(5)select    查询输出(语法规则要求select写前面)

(6)order  by   永远在最后

演示:按照部门号分组,统计每个部门的人数,要求显示部门人数大于2的部门,还要求按照人数进行排序

select dept_id, count(id) ac from s_emp group by dept_id having count(id)>2 order by ac;

数据库之分组