MySQL常见的聚合函数:
目录
基本语法:
常见的五大聚合函数:
AVG/SUM:
MAX/MIN:
COUNT:
如果要进行计算表中有多少条记录,应该怎么使用COUNT来进行计算?
方式1:
方式2:
方式3:
那么对于上述三种方式的效率,谁更好?
三者的效率:
举例:
聚合函数将一列数据作为整体,进行数学运算或者统计分析,返回汇总结果。也就是聚合函数作用于一组数据,并对一组数据返回一个值。
基本语法:
SELECT 聚合函数(列名)
FROM 表名;
常见的五大聚合函数:
AVG/SUM:
AVG:求平均数
SELECT AVG(字段名)
FROM 表名;
AVG=SUM/COUNTSUM:求和
SELECT SUM(字段名)
FROM 表名;
只适用于数值类型的字段或者变量,不会计算NULL。
MAX/MIN:
MAX:求取最大值
SELECT MAX(字段名)
FROM 表名;MIN:求取最小值
SELECT MIN(字段名)
FROM 表名;
适用于数值类型、字符串类型、日期时间类型的字段或者变量,不会计算NULL。
COUNT:
查询指定字段在表中的次数
和该字段的数值没有关系,统计该字段的个数
SELECT COUNT(字段名)
FROM 表名;
注意:COUNT(字段名)只是返回该字段不为空的行数
如果要进行计算表中有多少条记录,应该怎么使用COUNT来进行计算?
方式1:
SELECT COUNT(字段名)
FROM 表名;
方式2:
SELECT COUNT(常数)
FROM 表名;
方式3:
SELECT COUNT(*)
FROM 表名;
在上述方式中,方式1统计表的记录,不一定正确,因为COUNT不会计算NULL,如果查询字段的值有NULL值,那么计算的结果就会变少。
那么对于上述三种方式的效率,谁更好?
对于MyISAM存储引擎的表是没有区别的。因为内部有一计数器在维护行数。统计表的行数的时间复杂度只需要O(1)。
对于InnoDB存储引擎的表用COUNT(*),COUNT(1)直接读取行数,复杂度为O(n),因为InnoDB要去数一遍,但是好于具体的COUNT(字段名)。
三者的效率:
一般情况下:COUNT(*)=COUNT(1)>COUNT(字段名)。
能不能用COUNT(字段名)替换COUNT(*)?
不要替换,因为COUNT(*)是SQL92定义的标准统计行数的语法,与数据库无关,与NULL和非NULL无关。
举例:
牛客网SQL题目:
查找GPA最高值_牛客题霸_牛客网
题目:运营想要知道复旦大学学生gpa最高值是多少,请你取出相应数据
示例:某user_profile表如下:
id | device_id | gender | age | university | gpa |
1 | 2234 | male | 21 | 北京大学 | 3.2 |
2 | 2235 | male | NULL | 复旦大学 | 3.8 |
3 | 2236 | female | 20 | 复旦大学 | 3.5 |
4 | 2237 | female | 23 | 浙江大学 | 3.3 |
5 | 2238 | male | 25 | 复旦大学 | 3.1 |
6 | 2239 | male | 25 | 北京大学 | 3.6 |
7 | 2240 | male | NULL | 清华大学 | 3.3 |
8 | 2241 | female | NULL | 北京大学 | 3.7 |
我们可以使用之前所说的ORDER BY进行一个降序排序,那么第一个数据就是最大的。因为只要复旦大学学生的gpa,所以加上过滤条件。
# SELECT gpa
# FROM user_profile
# WHERE university = '复旦大学'
# ORDER BY gpa DESC
# LIMIT 0,1;
那么使用MAX函数,我们则可以是直接对gpa字段进行一个计算。得到最大值,然后进行过滤就行。
SELECT MAX(gpa) gpa
FROM user_profile
WHERE university = '复旦大学';
牛客网SQL题目:
计算男生人数以及平均GPA_牛客题霸_牛客网
题目:现在运营想要看一下男性用户有多少人以及他们的平均gpa是多少,用以辅助设计相关活动,请你取出相应数据。
示例:user_profile
id | device_id | gender | age | university | gpa |
1 | 2138 | male | 21 | 北京大学 | 3.4 |
2 | 3214 | male | 复旦大学 | 4.0 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 |
5 | 5432 | male | 25 | 山东大学 | 3.8 |
6 | 2131 | male | 28 | 北京师范大学 | 3.3 |
根据输入,你的查询应返回以下结果,结果使用round保留到小数点后面1位。
我们可以利用SUM函数求取gpa字段的和,然后对人数进行统计,求取平均值。用单行数值函数ROUND来保留小数。
SELECT COUNT(gender) "male_num",
ROUND(SUM(gpa)/COUNT(gender),1) "avg_gpa"
FROM user_profile
WHERE gender = 'male';
也可以直接使用AVG函数对gap进行求平均值。
SELECT count(gender) "male_num" ,
round(avg(gpa),1) "avg_gpa"
FROM user_profile
WHERE gender = 'male';