mysql 常用的分组聚合函数
1.聚合运算
一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.
根据定义,聚合函数对一组值执行计算并返回单个值.
MySQL提供了许多聚合函数,包括
AVG
,COUNT
,SUM
,MIN
,MAX
等.除COUNT
函数外,其它聚合函数在执行计算时会忽略NULL
值.有如下
prices
表,分别进行聚合操作use test;-- 创建表 create table prices( id int not null, count1 int, count2 int, count3 int, primary key (id)) engine=InnoDB default charset utf8mb4;insert into prices values(1,20,null,null),(2,50,500,null),(3,390,262,null),(4,28,234,null);select * from prices;
id count1 count2 count3 1 20 null null 2 50 500 null 3 390 262 null 4 28 234 null 注意:
函数不允许嵌套使用,比如:
count(max(..))
函数的参数可以是列或者函数表达式
一个select语句可以出现多个聚合函数
avg()
:求平均值
自动忽略
null
值mysql root@192.168.101:test> select avg(count1),avg(count2),avg(count3) from pri ces; +-------------+-------------+-------------+| avg(count1) | avg(count2) | avg(count3) |+-------------+-------------+-------------+| 122.0000 | 332.0000 | <null> |+-------------+-------------+-------------+
count()
:统计出现的满足条件的次数.
不忽略
null
值-- count 计数-- 返回count2中等于500的个数 select count(count2) from prices where count2=500;-- 返回总共的行数select count(*) from prices;-- 返回不重复的值select count(distinct count2) from prices;
max()\min()\sum()
自动忽略
null
值select max(count1),min(count2),sum(count3) from prices;
2.分组计算
基本语法:
select 聚合函数(字段名) from 表名where 查询条件group by 字段名having 过滤条件
1.gruop by
作用于聚合函数,根据给定的列或表达式的每一个不同的值将表中的行分成不同的组,使用函数返回每一组的统计信息.
SELECT column_name, aggregate_function(column_name) -- aggregate_function 聚合函数FROM table_nameWHERE column_name operator valueGROUP BY column_name;
出现在select子句中的单独的列,必须出现在group by 子句中作为分组列
分组列可以不出现在select 子句中
分组列可出现在select 子句中的一个复合表达式中
如果group by 后面是一个复合表达式,那么在select子句中,它必须整体作为表达式的一部分才能使用
有如下员工表(
db_employee
):-- 创建员工表create table db_employee( id int(11) not null auto_increment, name varchar(20) not null, date datetime not null, singin tinyint(4) not null default 0 comment '登陆后台次数', primary key (id)) engine=InnoDB default charset utf8;insert into db_employee values(1, 'Jack', '2016-04-19 15:26:02', 1),(2, 'Peny', '2016-04-11 15:26:02', 4),(3, 'Jony', '2016-04-12 15:26:02', 2),(4, 'Bob', '2016-04-13 15:26:02', 4),(5, 'Harry', '2016-04-15 15:26:02', 6),(6, 'Peny', '2016-04-17 15:26:02', 4);select * from db_employee;
id name date singin 1 Jack 2016-04-19 15:26:02 1 2 Peny 2016-04-11 15:26:02 4 3 Jony 2016-04-12 15:26:02 2 4 Bob 2016-04-13 15:26:02 4 5 Harry 2016-04-15 15:26:02 6 6 Peny 2016-04-17 15:26:02 4 将数据表按名字进行分组,并统计每个人有多少条记录
mysql root@192.168.101:test> select name,count(*) as number from db_employee group by name; +-------+--------+| name | number |+-------+--------+| Bob | 1 || Harry | 1 || Jack | 1 || Jony | 1 || Peny | 2 |+-------+--------+
将数据表按名字进行分组,并统计每个人登录多少次(分组求和)
mysql root@192.168.101:test> select name,sum(singin) from db_employee group by name; +-------+-------------+| name | sum(singin) |+-------+-------------+| Bob | 4 || Harry | 6 || Jack | 1 || Jony | 2 || Peny | 8 |+-------+-------------+
更改数据,并先按照名字分组,在按照登陆次数分组(多组分)
update db_employee set singin=5 where id = 6;select name,singin from db_employee group by name,singin;
gruop by
: 首先将select语句得到一个结果集,然后按照分组字段,将具有相同分组字段的记录归类成一条记录.
2.having
语法:
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_nameHAVING aggregate_function(column_name) operator value;
where
子句比group by
先执行,而函数必须在gruop by
之后再执行,那么在group by
之后可以使用having
子句进行结果集的过滤
where
子句在分组前对记录进行过滤
having
子句在分组后对记录进行过滤
having
的用法
having
可以单独使用不和group by
配合,如果只有having
,表中所有的列分为一组
having
子句中可以使用 函数
having
子句中的列,那么出现在函数中,那么出现在group by
子句中,否则报错.-- 显示id大于2,并且按照人名进行排列,排列的结果要求大于4select name, sum(singin) as count from db_employee where id > 2 group by name having sum(singin) > 4;