MySQL5.7从入门到精通--------聚合函数(3)
有时候并不需要返回实际表中的数据,而知识对数据进行总结。MySQL提供了相关的聚合函数,常见的聚合函数有: AVG()、COUNT()、MAX()、MIN()、SUM()
GROUP BY 与 聚合函数一起使用,将会对每个分组进行聚合函数运算操作。
7.3.1 COUNT()函数
count(*)计算表中总的行数,不管某列有数值或者为空值。
count(字段名)计算指定组下总的行数,计算时将忽略空值的行。
根据同行的结论
- count(*)和count(1)执行的效率是完全一样的。
- 在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;
- 但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多;原因很简单,因为需要判断每条记录的COL是否为空
SELECT COUNT(0),COUNT(1),COUNT(*) FROM t_student;
DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
address VARCHAR(255)
);
INSERT INTO t_student(name,address) VALUES('大宇','123@qq.com'),('小大宇','456@qq.com'),('小宇',null);
在计算查询出来的列的时候,COUNT(COL)会把 指定COL为NULL的这条记录忽略,只计算COL IS NOT NULL 的记录的总数。
SELECT
COUNT(*),
COUNT(address)
FROM
t_student;
需求:根据下面的version版本号进行分组,并计算每个组的数量。
SELECT
count(address), --在本组中 忽略address的记录
count(*), --在本组中 不忽略任何记录
GROUP_CONCAT(NAME) --拼接本组所有记录的name属性
FROM
t_student
GROUP BY
version
7.3.2 SUM()函数与AVG()函数
DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
score INT(11),
classId INT(11)
);
INSERT INTO t_student(name,score,classId) VALUES('赵',80,1),('钱',90,1),('孙',60,2),('李',80,2);
SELECT * FROM t_student;
计算四个学生的成绩的总分与平均分。
SELECT
SUM(score) AS total,
AVG(score)
FROM
t_student
使用SUM()、AVG()与GROUP BY 一起使用的话,那么就是计算的某个分组的总和。
现要分别计算一班与二班的学生成绩的总分与平均分。
SELECT
classId,
SUM(score) AS total,
AVG(score) AS 平均分
FROM
t_student
GROUP BY
classId
7.3.2 MAX()函数与MIN()函数
MAX()返回指定列中中的最大值。
MIN() 返回指定列中的最小值。
MAX()与MIN()在与GROUP BY 一起使用的时候,会计算某个分组中的最大值。
SELECT * FROM t_student;
现在的需求是,找出学生表里面成绩最好的人与最差的人。
不能同时查询最小的值与最大的值的记录,因为它们不是同一条记录。
SELECT
NAME,
MAX(score)
FROM
t_student;
仔细看,上述查询结果有误,name按道理应该是90分的钱,结果name属性的查询结果是赵。
MAX()、MIN()函数只能找出最大的值或者最小的值,无法定位到那条记录,因此需要再查询一次。
SELECT * FROM t_student t
WHERE t.score = (SELECT MAX(score) FROM t_student)
SELECT
NAME,
MIN(score)
FROM
t_student;
同样,上述查询依旧是错误的,原因我大概已经猜到了。
一般来说,聚合函数如MAX()、MIN()函数,会与GROUP BY 一起使用。如果没有与GROUP BY 一起使用,那么默认把所有的查询数据视为同一组。返回给客户端的是默认的分组中的第一条数据。而MAX(COL)是通过计算分组中的最大值,所以MAX(COL)的数据是没有错误的。但是其它属性,比如上述例子中的name,将会返回t_student表的第一条数据。
MAX()、MIN()也适用于字符串,按照a-z从小到大的顺序比较。
.