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从小到大的顺序比较。

 

 

.

posted @ 2022-07-17 12:15  小大宇  阅读(89)  评论(0编辑  收藏  举报