_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':no such file or directory数据库笔试题及答案Mysql Where 条件使用列别名Every derived table must have its own aliasMySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)utf8mb4 字符集(4字节 UTF-8 Unicode 编码)Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE)right syntax to use near 'USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8' at line 6mysql中delete的表别名使用方法Windows7下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.batMySQL与PostgreSQL比较 哪个数据库更好java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column 'Content' at row 1service mysqld start MySQL Daemon failed to start.Python Version 2.7 required which was not found in the registry解决python连接mysql,UTF-8乱码问题如何从官网下载MySQL最新版本的安装包?MySQL 如何实现行转列分级输出?Bluemix云端数据库服务使用示例———PHP投票程序Bluemix云端数据库服务ClearDB MySQL使用示例———Python开发投票程序MySQL 数据库简介Windows 安装最新版 MySQLLinux 安装最新版MySQL与 MySQL 建立连接MySQL 创建子账号MySQL 多实例配置MySQL 创建数据库MySQL 删除数据库MySQL 选中数据库MySQL 的数据类型1MySQL 的数据类型2MySQL 设计数据表MySQL 数据表设计规范ALTER 命令修改表MySQL 删除数据表INSERT 插入数据DELETE 删除数据SELECT 查询数据UPDATE 更新数据LIKE 模糊查询WHERE 条件查询UNION 联合查询ORDER BY 排序JOIN 表连接DISTINCT 去重GROUP BY分组聚合函数 AVG、COUNT、SUM聚合函数 MIN、MAX条件判断函数MySQL 的系统函数MySQL 中使用正则表达式MySQL 存储引擎概述

GROUP BY分组

GROUP BY分组

本小节介绍如何对查询结果使用 GROUP BY 分组,GROUP BY 分组是对指定一个或多个字段分组,使用分组可以较好地对数据结果分析和处理。

1. 插入测试数据

为了后面演示方便,这里向 course 表插入测试数据:

INSERT INTO course (course_name,teacher_id) VALUES('毛概',),('线性代数',),('政治',),('程序设计语言',),('离散数学',),('编译技术',),('嵌入式基础',),('单片机原理',),('图像处理',),('数字信号处理',),('专业英语',),('网络编程',);

执行结果如下图:

图片描述

2. 单字段分组

先查看 course 表所有数据:

SELECT * FROM course;

查询结果如下图:

图片描述

以表 course 为例,需要查出所有课程教师相关信息,按照 teacher_id 字段分组可去除重复数据:

 SELECT teacher_id FROM course GROUP BY teacher_id;

查询结果如下图:

图片描述

根据上面分组结果还可以使用 LEFT JOIN 连接查询分组:

SELECT .teacher_id,t.* FROM course  LEFT JOIN teacher t ON .teacher_id=t.id GROUP BY .teacher_id;

执行结果如下图:

图片描述

3. 多字段分组

以查询学生选课关联表为例,查询学生选课相关信息:

SELECT * FROM student_course  
INNER JOIN student  
ON .student_id=.id 
INNER JOIN course  
ON .course_id=.id 
INNER JOIN teacher  
ON .teacher_id=.id;

查询结果如下图;

图片描述

上图是不同学生选课相关的信息数据,可以使用 GROUP BY 按照 teacher_id、course_id 分组来展示所有教师的所有课程信息:

SELECT .teacher_id,.course_id,.course_name,.nameFROM student_course  
INNER JOIN student  
ON .student_id=.id 
INNER JOIN course  
ON .course_id=.id 
INNER JOIN teacher 
ON .teacher_id=.id 
GROUP BY .teacher_id,.course_id;

执行结果如下图:

图片描述

Tips:单字段分组和多字段分组的区别在于,单字段是以一个字段来判断数据是否重复分组出来的结果,多字段分组是以多个字段同时来判断是否重复分组出来的结果。

4. 小结

本小节介绍了如何使用 GROUP BY 对查询结果集分组筛选出想要的内容,相对于前面小节的内容来说,本小节 GROUP BY 分组较为复杂,需要仔细的体会和思考,需要注意的是使用 GROUP BY 分组时,要将 MySQL 的 sql model 配置中 ONLY_FULL_GROUP_BY 的值去除掉,如果有该 sql_model 配置,在 SELECT 中的列,没有在 GROUP BY 中出现,那么这个 SQL 是不合法的,这样的严格模式对新手不友好,需要去除该配置,查看当前 sql_model 配置命令:

SELECT @@sql_mode;

执行结果如下图:

图片描述

上图中 sql_model 中并没有 ONLY_FULL_GROUP_BY 配置值,若想要配置 sql_mode 则可以在 MySQL 配置文件中 [mysqld] 下面增加 sql_model,设置好之后,重启 MySQL 即可,内容如下格式:

sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'