group by 及 having 子句使用

1. Group by子句(利用group by子句分组数据,当select语句中使用到组函数和字段一起连用时会用到group by,否则会出现错误)

Group by 把select查询的结果集分成几个小组,这个group by子句可以跟在where后面且在having前面。

Group by子句也会触发排序操作,会按分组字段排序。

Select [组函数和分组的字段].....from 表名 group by[字段1][字段2],。。。。。。;

Oracle sql语句顺序:

a. Select 显示字段或组函数 from 表名

b. [ Where 过滤条件(不能使用组函数 ,不能使用列别名)

c. [Group by 分组条件] (不能使用列别名,只可是字段名,不可是组函数)

d. [Having 分组的过滤条件(可以使用组函数)

e. [ Order by 排序 ] (可以使用列别名,可以使用组函数)

说明:其中的[ ]是可选项

注意:group by分组不能用列的别名

注意:只要写了group by子句,select后就只能用group by之后的字段或者是组的函数。Having子句可以过滤组函数结果或者分组的信息,并且写在group by子句后。

使用group by子句时,必须满足下面的一些原则:

l select子句的后面,只能有两种类型的表达式,一种是组函数,一种是出现在group by子句后面的列名。

l 没有出现在group by子句后面的列名不能出现在select子句中非组函数表达式中,但是出现在group by子句后面的列名可以不出现在select子句中非组合函数表达式中。

l 如果使用了where子句,那么所有参加分组计算的数据必须首先满足where子句指定的条件。

l 在默认情况下,系统按照group by子句中指定的列升序排列,但是可以使用order by子句指定新的排列顺序。

使用group by 常见的错误:

l 如果在select语句中没有出现group by子句,那么不能在select子句中同时出现单个列名和组函数的混合现象。

l 如果希望限制分组中的数据,那么可以使用having子句而不能使用where子句。即having中可以出现组函数而where不能出现组函数。

注意1:在没有group by时,select后不能把普通字段和组函数同时使用

注意2where子句只能够过滤记录,放单行函数。Where后面跟随的条件是对所有数据的过滤的条件,在where子句中不能出现组函数。

注意3:如果希望按照多个列分组,那么会在group by子句后面出现多个列名。这些列名称得顺序非常重要。因为不同的顺序有不同的结果。

例子1:查询求各个部门的最小,最高,工资之和

select dept_id,min(salary),max(salary),sum(salary) from s_emp group by dept_id

例子2:查询求各个部门的最小,最高,工资之和,部门名称

select e.dept_id,d.name,min(salary),max(salary),sum(salary) from s_emp e , s_dept d where e.dept_id=d.id group by e.dept_id,d.name;

3:找出各个部门的平均工资

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

注:在没有group by时,select后不能把普通字段和组函数同时使用

4:求各个部门不同职位有多少人

select dept_id,title,count(*) from s_emp group by dept_id,title;

5:求除了42部门以外的各个部门的平均工资

select dept_id,avg(salary) from s_emp where dept_id<>42 group by dept_id;

7:求各个部门的平均工资

select max(d.name),max(r.name),avg(salary) from s_emp e,s_dept d,s_region r

where e.dept_id=d.id and d.region_id=r.id group by dept_id;

2. Having子句(是对分组之后的数据进行过滤,所以使用having时必须用group by先分组)

Having中的组函数可以不是select 中的组函数

利用having子句过滤分组的行

注意:having要先过滤掉不需要的记录,然后再进行分组操作,提高效率。having子句可以过滤组函数结果或是分组的信息,且写在group by子句后。

例:求平均工资大于2000的部门

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值