聚合函数
AVG()需注意两点
AVG针对数值型数据做操作,对字符串虽然没有抛出异常,但为0值,没有实际含义。
AVG计算有空值的数据时,会把NULL扔掉,总数会相应减少。
COUNT()
COUNT返回的是非NULL值的所有值的计数。
聚合函数特点:对多列进行操作,操作之后返回一行值
SELECT SUM(Price),SUM(SqFt),SUM(Neighborhood)
FROM `house-prices`
DISTINCT与集合函数的结合运用
DISTINCT相当于去重, COUNT相当于计数
SELECT COUNT(DISTINCT Price)
FROM `house-prices`
判断是否有重复值,可以用SUM和DISTINCT结合来判断
SELECT SUM(DISTINCT SqFt),SUM(SqFt)
FROM `house-prices`
如果两个数不相等,就可以说明有重复值
另外可参考这篇博客
MySQL 聚合函数
GROUP BY
SELECT Bedrooms,COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms;
根据Bedrooms的数量(2,3,4,5)类别,来分别统计各自的房子数量。
如果有NULL,也会当作一个类来进行统计
SELECT Price ,COUNT(*)
FROM `house-prices`
GROUP BY Price;
SELECT Bedrooms, Bathrooms, COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms, Bathrooms;
想要根据Bedrooms和Bathrooms来计算相应的房子数,那在GROUP BY后面就要两个都写上,不能只写一个
SELECT Bedrooms as Br, Bathrooms, COUNT(*)
FROM `house-prices`
GROUP BY Br, Bathrooms;
现在可能由于版本更新可以GROUP BY 后面写别名了,但是仍旧不建议这么写
GROUP BY不会自动做排序
SELECT Bedrooms, COUNT(*)
FROM `house-prices`
WHERE COUNT(*) > 20
GROUP BY Bedrooms;
选择按Bedrooms分类下大于20的房子数,发现这样写报错
这里不应该用WHERE,应该用HAVING
SELECT Bedrooms, COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms
HAVING COUNT(*) > 20;
所以这里应该能明白,WHERE是对初始的表的行进行筛选的,而我们现在想选择的是分组之后显示的数据表,然后再对行进行筛选,也就是对分组后结果进行筛选。
如果是这样极端的筛选,这时结果是一样的,但更推荐用WHERE,HAVING是对GROUP BY分组之后进行的筛选,主要是执行顺序的差异,WHERE是在GROUP BY之前执行的,性能和运算速度会提高,所以能在原始数据筛选的就首选WHERE,分组之后才能筛选的就用HAVING。
SELECT Bedrooms, COUNT(*)
FROM `house-prices`
WHERE Bedrooms = 2
GROUP BY Bedrooms;
SELECT Bedrooms, COUNT(*)
FROM `house-prices`
GROUP BY Bedrooms
HAVING Bedrooms = 2;
HAVING 的参数一般是GROUP BY中的字段名,另外还可以有聚合函数
SELECT Bedrooms, SUM(Price)
FROM `house-prices`
GROUP BY Bedrooms
HAVING COUNT(*) > 2;
首先按照Bedrooms分组,然后计数所有Bedrooms>2的房间数,并根据价格求和。这里没有SELECT COUNT(*),所以不会显示分组后计数的房间数。
ORDER BY 后面可以接合理的聚合函数,GROUP BY中出现的字段,SELECT 中出现的字段
SELECT Bedrooms, SUM(Price)
FROM `house-prices`
GROUP BY Bedrooms
ORDER BY SUM(Price);
当然,还有另外的情况,ORDER BY中接SELECT中没有的字段,这是就要把聚合函数删除了,因为聚合函数的基础是在GROUP BY的基础之上的。
SELECT Bedrooms
FROM `house-prices`
ORDER BY Bathrooms;
SELECT语句的执行顺序,例如
SELECT Bedrooms,COUNT(*)
FROM `house-prices`
WHERE Bathrooms = 2
GROUP BY Bedrooms
HAVING COUNT(*) > 20
ORDER BY Bedrooms;
首先执行FROM
其次执行WHERE,也就是筛选条件
再执行GROUP BY,分组
分组之后执行HAVING来过滤条件
过滤之后再SELECT,选择呈现的字段
最后ORDER BY呈现效果