聚合函数
聚合函数表示对值集合进行操作的组(集合)函数。
# 华为手机价格的平均值
SELECT AVG(price) FROM `products` WHERE brand = '华为’;
# 计算所有手机的平均分
SELECT AVG(score) FROM `products`;
# 手机中最低和最高分数
SELECT MAX(score) FROM `products`;
SELECT MIN(score) FROM `products`;
# 计算总投票人数
SELECT SUM(voteCnt) FROM `products`;
# 计算所有条目的数量
SELECT COUNT(*) FROM `products`;
# 华为手机的个数
SELECT COUNT(*) FROM `products` WHERE brand = '华为';
认识Group By
事实上聚合函数相当于默认将所有的数据分成了一组:
我们前面使用avg还是max等,都是将所有的结果看成一组来计算的;
那么如果我们希望划分多个组:比如华为、苹果、小米等手机分别的平均价格,应该怎么来做呢?
这个时候我们可以使用 GROUP BY;
GROUP BY通常和聚合函数一起使用:
表示我们先对数据进行分组,再对每一组数据,进行聚合函数的计算;
我们现在来提一个需求:
根据品牌进行分组;
计算各个品牌中:商品的个数、平均价格
也包括:最高价格、最低价格;
SELECT brand,
COUNT(*) as count,
ROUND(AVG(price),2) as avgPrice,
MAX(price) as maxPrice,
MIN(price) as minPrice,
AVG(score) as avgScore
FROM `products` GROUP BY brand;
Group By的约束
使用我们希望给Group By查询到的结果添加一些约束,那么我们可以使用:HAVING。
比如:如果我们还希望筛选出平均价格在4000以下,并且平均分在7以上的品牌:
SELECT brand,
COUNT(*) as count,
ROUND(AVG(price),2) as avgPrice,
MAX(price) as maxPrice,
MIN(price) as minPrice,
AVG(score) as avgScore
FROM `products` GROUP BY brand
HAVING avgPrice < 4000 and avgScore > 7;
创建多张表
假如我们的商品表中,对应的品牌还需要包含其他的信息:
比如品牌的官网,品牌的世界排名,品牌的市值等等;
如果我们直接在商品中去体现品牌相关的信息,会存在一些问题:
一方面,products表中应该表示的都是商品相关的数据,应该又另外一张表来表示brand的数据;
另一方面,多个商品使用的品牌是一致时,会存在大量的冗余数据;
所以,我们可以将所有的品牌数据,单独放到一张表中,创建一张品牌的表:
create table if not exists `brand`(
id int primary key auto_increment,
name varchar(20) not null,
website varchar(100),
worldrank int
);
create table if not exists `products`(
`id` int primary key auto_increment,
`title` varchar(20),
`description` varchar(200),
`price` double,
`publishtime` datetime
);
插入