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;