9、SQL-GROUP BY 语句
SQL-GROUP BY 语句
一、概念
group by 语句:分组函数,根据by 之后的规则对数据进行分组。分组就是将杂乱的数据集,按照某种规则划分成若干个小区域,然后对小区域进行汇总处理。
类似于excel中的数据透视表,按照某些行/列进行数据的汇总处理。
二、group by 的使用
1、聚合函数
group by 配合聚合函数进行使用。常用的聚合函数有:
- count() 计数
- sum() 求和
- avg() 平均数
- max() 最大值
- min() 最小值
2、group by 语法:
select column_name, aggregate_function(column_name)
from table_name
where colunm_name operator value
group by colum_name
select 列名,聚合函数(列名) from 表
where 列名=“XX”
group by 列名
3、例子:
有如下的表“PRICE”:
3.1 查找每个客户的总金额
select customer ,sum(price)from price
group by customer
结果集类似如下:
如果省略了group by,则结果集如下:
如果使用语句省略了group by ,结果集效果非我们所需要的。
上面的select 语句指定了两列(customer和sum(price)),“sum(price)”返回一个单独的值(“price”列的综合),而“customer”返回6个值(每个值对应“price”表中的每一行)。因此我们得不到正确的结果集。
3.2 group by 一个以上的列
select customer,date,sum(price)from price
group by customer,date
结果集如下:
如果语句变成:
select customer,date,sum(proce)from price
group by customer
执行以上语句则会报错,因为可能导致一行中某一列存在多个值
3.3涉及多个表
表1:price 表
表2:department
select
(select d.dept_name from department d where p.dept_no = d.dept_no) as 部门,
count (p.customer_no) as 人数
from price p
group by p.dept_no
结果集如下:
3.4 Having与Where的区别
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
select
(select d.dept_name from department d where p.dept_no = d.dept_no) as 部门,
count (p.customer_no) as 人数
from price p
where p.date > “2019-05-23”
group by p.dept_no
having count(p.costomer_no) >1
结果集如下: