MySQL燕十八老师课程笔记:第八课:SQL之group分组及统计函数详解

5个统计函数:min max sum avg count

# 查询出最贵的商品的价格
# 即shop_price最大的值查询出来
select max(shop_price) from goods;
# 同理,查询出最便宜的商品的价格
select min(shop_price) from goods;
# 查询出发布最早的商品,即goods_id最小的值
select min(goods_id) from goods;
# goods_number是指库存量,
# 店主想统计一下,本店一共库存多少件商品,
# 应该把每一行上的goods_number字段都加起来
select sum(goods_number) from goods;
# 店主想查看自己店里所有商品的平均价格——avg:求平均
select avg(shop_price) from goods;
# 店主想统计一下本店一共有多少种商品。——count:求行数
select count(*) from goods;
# 或者
select count(1) from goods;
# 或者
select count(0) from goods; 也行。

例:

create table test(
id int,
name varchar(20)
)engine myisam charset utf8;

insert into test 
values(1,'lisi');

insert into test
values(2,null);

select * from test;

select count(*) from test;

在这里插入图片描述
在这里插入图片描述
不能用某一个特定的字段来select,因为这种情况下不会把null数出来!

在这里插入图片描述
例:

insert into test
values(null,null);

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

总结:

select count(*) from 表名,查询的就是绝对的行数,哪怕某一行所有字段权威NULL在内,
而select count(列名) from 表名,查询的是该列不唯null 的所有行的行数。

用count() count(1),谁好呢?
其实,对于myisam引擎的表,这两种计数方式没有区别。这种引擎内部有一个计数器在维护着行数。
可是用 innodb 引擎的表,用count(
)直接读行数,效率很低,因为 innodb 真的要去数一遍。

上述5个统计函数,单独使用,意义不大,要和分组配合起来使用!

# 计算第3个栏目下所有商品的库存量之和。sum(goods_num)
select sum(goods_number) from goods
where cat_id =3;
# 同理,计算第4个栏目下所有商品的库存量之和。
select sum(goods_number) from goods
where cat_id =4;
# 一次性计算完,每个栏目下的库存量之和:——group 分组查询
select cat_id,sum(goods_number) from goods
group by cat_id;

分了组再统计,这样更有意义!

# 提问:以下语句对不对?
select goods_id, sum(goods_number) from goods;

# 不行,因为goods_id 和 sum(goods_number)不对应。

在这里插入图片描述
语句执行后:为什么把goods_id等于一取出来?
答:对于SQL标准来说,这个语句是错误的,是不能执行的,但是,在MySQL中可以这么干。
而且,goods_id是把第一次出现的值取出来。

思考:全班同学排队,校长对老师说:统计全班同学的姓名和平均年龄(返回一行)
语义上的疑问:平均年龄好算,只有一个结果,但是把谁的姓名和平均年龄放在一块返回呢?
语义上就解释不通,但是MySQL中却偏偏可以取姓名,而且是把队伍的第一位同学的姓名返回。这是MySQL的特点,出于可移植性和规范性,不推荐这么写。
严格的讲,以group by a,b,c 为列,则select 的列只能在a, b, c 里选择,语义上才没有矛盾。

# 按cat_id分组,计算每个栏目下的商品的平均价格
select cat_id,avg(shop_price) from goods
group by cat_id;
# 思考:查询每个栏目下面:
#       最贵商品价格、最低商品价格、商品平均价格、商品库存量、商品种类。
#     提示:(5个聚合函数,sum,avg,max,min,count 与group综合运用)
select cat_id,max(shop_price) from ecs_goods group by cat_id;
select cat_id,min(shop_price) from ecs_goods group by cat_id;
select cat_id,avg(shop_price) from ecs_goods group by cat_id;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值