6,mysql分组及聚集函数不同的用法

语法:

select 列,列 ··· from 表 group by 列(分组对象) having 条件表达式;
having 相当于where但不能用where代替
区别; where后面不能使用聚集函数
having 后面能使用聚集函数
当分组后想用聚集函数来充当查询条件时用having就行了。

1.集函数:当不与group by 连用时

AVG() 返回某列的平均值
COUNT() 返回某列的个数
MAX() 返回某列中元素的最大值
MIN() 返回某列的最小值
SUM() 返回某列的和
注意:1,这些函数不能直接嵌套:max(count(列))

2.集函数:当与group by 连用时

AVG() 返回某列中的平均值
COUNT() 返回某列的个数
MAX() 返回某列中元素的最大值
MIN() 返回某列的最小值
SUM() 返回某列的和
注意:1,这些函数不能直接嵌套:max(count(列))

2.分组的意义:

对group by 后面的列 进行合并,分组成新的表,并显示select 后面的列,但列中的值可能为多值但值只能是唯一,所以用到集函数进行,变值为唯一,这样才能显示出来。

3.分组的意义的解释

原表
mysql> select sno,cno from sc;
±------±----+
| sno | cno |
±------±----+
| 08001 | 002 |
| 08001 | 003 |
| 08001 | 004 |
| 08001 | 006 |
| 08002 | 002 |
| 08002 | 003 |
| 08003 | 001 |
| 08003 | 002 |
| 08003 | 003 |
| 08004 | 001 |
| 08005 | 007 |
| 08005 | 002 |
| 08006 | 003 |
| 08008 | 001 |
| 08008 | 003 |
| 08009 | 001 |
| 08009 | 004 |
| 08010 | 005 |
±------±----+
这时对cno进行分组,mysql> select sno,cno from sc group by cno;
然后就相当与产生了新的表(假设):
±------±----+
| sno | cno |
±------±----+
| 08003 | |
| 08004 | 001 |
| 08008 | |
| 08009 | |
| 08001 | |
| 08005 | 002 |
| 08002 | |
| 08003 | |


所以相当于sno有多个值,但sql中值只能唯一,所以这句话报错:
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'school.sc.Sno' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
但,若使用集函数,对sno多个值进行选择或相加使值唯一,这样就可以显示出来了:
mysql> select min(sno),cno from sc group by cno;
±---------±----+
| min(sno) | cno |
±---------±----+
| 08003 | 001 |
| 08001 | 002 |
| 08001 | 003 |
| 08001 | 004 |
| 08010 | 005 |
| 08001 | 006 |
| 08005 | 007 |
±---------±----+
而count(sno)这句话就证明了分组后产生了新表这一假设,但由于值为一、所以无法显示。
mysql> select count(sno),cno from sc group by cno;
±-----------±----+
| count(sno) | cno |
±-----------±----+
| 4 | 001 |
| 4 | 002 |
| 5 | 003 |
| 2 | 004 |
| 1 | 005 |
| 1 | 006 |
| 1 | 007 |
±-----------±----

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚无-缥缈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值