mysql function 表名作为参数_mysql 常用的分组聚合函数

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;
idcount1count2count3
120nullnull
250500null
3390262null
428234null

注意:

  • 函数不允许嵌套使用,比如: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;
idnamedatesingin
1Jack2016-04-19 15:26:021
2Peny2016-04-11 15:26:024
3Jony2016-04-12 15:26:022
4Bob2016-04-13 15:26:024
5Harry2016-04-15 15:26:026
6Peny2016-04-17 15:26:024

将数据表按名字进行分组,并统计每个人有多少条记录

 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;

0dc451ad8b1f4ea8e83a36fcd62d4844.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值