分组筛选的异同

语法
SELECT 分组函数,查询字段,
FROM 表
WHERE 筛选条件
GROUP BY 分组的字段
HAVING 分组函数的筛选条件
ORDER BY 排序的字段


特点

  1. GROUP BY后跟分组函数查询的字段
  2. 分组可以按单个字段也可以多个字段
使用的表 位置 关键字
分组前筛选 原始表 group by 之前 where
分组后筛选 group by后的结果集 group by 之后 having

案例

CREATE DATABASE IF NOT EXISTS students DEFAULT CHARSET UTF8 COLLATE UTF8_GENERAL_CI ;
USE students;
DROP TABLE IF EXISTS student_info;
CREATE TABLE student_info(
`name` VARCHAR(10) NOT NULL,
id INT NOT NULL,
chinese_score FLOAT NOT NULL,
math_score FLOAT NOT NULL,
english_score FLOAT NOT NULL);

INSERT INTO student_info VALUES ('张三',1,1,98),('李四',2,1,89),('王五',3,1,56),('代',4,1,78),
('开发',5,2,96),('大彻',6,2,76),('到底',7,2,46),
('隔热片',8,3,78),('功夫',9,3,85),('粉丝',10,3,91),
('丰富',11,4,82),('废惹',12,4,77),('大大',13,4,76),
('光荣',14,5,95),('分隔',15,5,72),('苹果',16,5,86);
SELECT * FROM student_info;

name           id  class_id  chinese_score  
---------  ------  --------  ---------------
张三              1         1               98
李四              2         1               89
王五              3         1               56
代               4         1               78
开发              5         2               96
大彻              6         2               76
到底              7         2               46
隔热片             8         3               78
功夫              9         3               85
粉丝             10         3               91
丰富             11         4               82
废惹             12         4               77
大大             13         4               76
光荣             14         5               95
分隔             15         5               72
苹果             16         5               86

分组前查询

  1. 查询班级id为1和2的学生的总个数

SELECT COUNT(*) AS 总数,class_id AS 班级
FROM student_info
WHERE class_id IN(1,2)
GROUP BY 班级;

总数  班级  
------  --------
     4         1
     3         2
  1. 查询每个班级语文成绩及格(分数>60)学生成绩的平均数

SELECT class_id AS 班级,ROUND(AVG(chinese_score),2) AS 语文成绩平均数
FROM student_info
WHERE chinese_score > 60
GROUP BY 班级

SELECT class_id AS 班级,ROUND(AVG(chinese_score),2) AS 语文成绩平均数
FROM student_info
WHERE chinese_score > 60
GROUP BY 班级

班级  语文成绩平均数  
------  -----------------------
     1                    88.33
     2                    86.00
     3                    84.67
     4                    78.33
     5                    84.33
    
    
班级  原始语文成绩平均数  
------  -----------------------------
     1                          80.25
     2                          72.67
     3                          84.67
     4                          78.33
     5                          84.33

分组后查询

  1. 查询语文成绩平均分大于75的班级
SELECT class_id AS 班级,ROUND(AVG(chinese_score),2) AS 语文成绩平均分
FROM student_info
GROUP BY 班级
HAVING 语文成绩平均分 > 75;
班级  语文成绩平均分  
------  -----------------------
     1                    80.25
     3                    84.67
     4                    78.33
     5                    84.33
  1. 查询每个班级的语文成绩最高分,并按照降序排序
SELECT class_id AS 班级,MAX(chinese_score) AS 最高分
FROM student_info
GROUP BY 班级
HAVING 最高分 > 90
ORDER BY 最高分 DESC;
班级  最高分  
------  -----------
     1           98
     2           96
     5           95
     3           91
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容