聚合函数

将整张表当成一组数据,对这组数据进行的操作即为聚合函数。

  1. # 1. 求所有手机价格的总和
  2. SELECT SUM(price) as totalPrice FROM `products`;
  3. # 2. 求所有华为手机价格的总和
  4. SELECT SUM(price) huaTotalPrice FROM `products` WHERE brand = '华为';
  5. # 3. 求所有华为手机的平均价格
  6. SELECT AVG(price) FROM `products` WHERE brand = '华为';
  7. # 4. 求所有华为手机的最高、最低价格
  8. SELECT MAX(price) FROM `products` WHERE brand = '华为';
  9. SELECT MIN(price) FROM `products` WHERE brand = '华为';
  10. # 5. 求所有华为手机的个数
  11. SELECT COUNT(*) FROM `products` WHERE brand = 'OPPO'; -- 21
  12. SELECT COUNT(url) FROM `products` WHERE brand = 'OPPO'; -- 17 ,5urlNULL
  13. SELECT COUNT(price) FROM `products`; -- 108
  14. SELECT COUNT(DISTINCT(price)) FROM `products`; -- 79,去掉了价格重复的

Group By

聚合函数是把整个表当成一组数据,Group By可以将数据分组。

# 根据brand不同分成多组,然后各组内进行聚合计算
SELECT AVG(price), COUNT(*), AVG(score) FROM `products` GROUP BY brand;

# SELECT加入brand,结果更清晰,但brand不能乱加,需要和GROUP BY后字段匹配 
SELECT brand, AVG(price), COUNT(*), AVG(score) FROM `products` GROUP BY brand;

image.png

HAVING

1. HAVING是对分组之后的结果进行二次筛选

获取分组后平均价格大于2000的数据
# 错误写法1
SELECT brand, AVG(price), COUNT(*), AVG(score) FROM `products` GROUP BY brand WHERE price > 2000;
# 错误写法2
SELECT 
    brand, 
  AVG(price) avgPrice, 
  COUNT(*), 
  AVG(score) 
FROM `products` 
GROUP BY brand 
WHERE avgPrice > 2000;

# 正确写法
SELECT 
    brand, 
  AVG(price) avgPrice, 
  COUNT(*), 
  AVG(score) 
FROM `products` 
GROUP BY brand 
HAVING avgPrice > 2000; -- 在21行之前(包括21行)统计完后,再执行22行

image.png

2. 数据

image.png
要求:
求评分大于9.0的手机,按照品牌分类后的平均价格

# 先where筛选,再分组,在此基础再算平均价格,平均分

SELECT 
    brand,
    AVG(price)
FROM `products` 
WHERE score > 9.0
GROUP BY brand;

结果:
image.png

3. 当然也可以在此基础上继续用HAVING

SELECT 
    brand,
    AVG(price) avgPrice
FROM `products` 
WHERE score > 9.0
GROUP BY brand 
HAVING avgPrice > 3000; -- 把7行和7行之前的看成分开执行就行了

结果:
image.png