[mysql练习]多行结果合并问题练习
有一个scores表,表结构和数据如下:
id, stu_id, name,course, grade
1,1,贾万, 语文, 90
2,1,贾万 ,数学 ,100
3,2,毛之远 ,语文 ,97
4,2,毛之远,数学 ,100
5,2 ,毛之远,物理(选修),90
通过SQL改写成这样:
学号,姓名,课程,综合平均成绩
1,贾万 | 语文,数学| 95
2,毛之远 |语文,数学,英语 |95.67
先建表和插入数据:
SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for scores
-- ----------------------------
DROP TABLE IF EXISTS `scores`;
CREATE TABLE `scores` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stu_id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`course` varchar(20) DEFAULT NULL,
`grade` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`id`,`stu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; -- ----------------------------
-- Records of scores
-- ----------------------------
INSERT INTO `scores` VALUES ('1', '1', '贾万', '语文', '90');
INSERT INTO `scores` VALUES ('2', '1', '贾万', '数学', '100');
INSERT INTO `scores` VALUES ('3', '2', '毛之远', '语文', '97');
INSERT INTO `scores` VALUES ('4', '2', '毛之远', '数学', '100');
INSERT INTO `scores` VALUES ('5', '2', '毛之远', '物理(选修)', '90');
分析:先把平均成绩求出来
select stu_id,name, avg(grade) as "综合成绩" from scores group by name;

然后插入想要的列:
select stu_id,name,"课程", avg(grade) as "综合成绩" from scores group by name;

然后思考怎么把 "课程" 这一个条件的结果改变成语文,数据,物理的整合结果。
我们根据课程去查询时,发现会返回多行课程结果,所以问题可以转变为多行合并为一行。
百度“mysql 多行合并”,发现了这个链接:http://www.cnblogs.com/guaiguaipaizz/p/6501676.html
其中提到了 GROUP_CONCAT 的用法 和 SEPARATOR 的用法,源码样例原封不动的拷贝过来(如果侵权了,我随时可以撤回,不过大家都是用于学习,不是商业用途,还请网开一面。)
SELECT am.activeId,GROUP_CONCAT(m.modelName SEPARATOR ',') modelName
FROM activemodel am
JOIN model m
ON am.modelId=m.modelId
WHERE m.valid=1
GROUP BY am.activeId
然后改写我们的案例SQL:
select stu_id,name,GROUP_CONCAT(course SEPARATOR ',') as "课程", avg(grade) as "综合成绩" from scores group by name;

[mysql练习]多行结果合并问题练习的更多相关文章
- mysql中将多行数据合并成一行数据
.1GROUP_CONCAT()中的值为你要合并的数据的字段名; SEPARATOR 函数是用来分隔这些要合并的数据的: ' '中是你要用哪个符号来分隔: 2.必须要用GROUP BY 语句来进行分组 ...
- MySQL配置索引页的合并阈值
MySQL配置索引页的合并阈值 如果删除行或者通过UPDATE操作缩短行 可以为索引页面配置MERGE_THRESHOLD值. 当delete与update缩短了行长度时,索引页的"page ...
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- 【MySQL】结构行长度的一些限制
今天被开发提交的DDL变更再次困惑,表中字段较多,希望将已有的两个varchar(4000)字段改为varchar(20000),我想innodb对varchar的存储不就是取前768字节记录当前行空 ...
- MySQL把多个字段合并成一条记录的方法
转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...
- 使用Notepad++将多行数据合并成一行
1.按Ctrl+F,弹出“替换”的窗口: 2.选择“替换”菜单: 3.“查找目标”内容输入为:\r\n: 4.“替换为”内容为空: 5.“查找模式”选择为正则表达式: 6.设置好之后,点击“全部替换” ...
- [转]关于MYSQL Innodb 锁行还是锁表
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...
- MySQL用命令行复制表的方法
mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 ; 或 CREATE TABLE 新表 LIKE 旧表 ; 注意上面两种方式,前一种方式是不会复制时的主键类型和自增方式是 ...
- mysql的锁--行锁,表锁,乐观锁,悲观锁
一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...
- Oracle多行记录合并的几种方法
今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nulla ...
随机推荐
- java报错 SLF4J:Failed to load class "org.slf4j.impl.StaticLoggerBinder"
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artif ...
- SpecCPU2017 测试cpu性能
SpecCPU介绍见: https://blog.csdn.net/qq_36287943/article/details/103601539 官网:https://spec.org/ 1.SpecC ...
- OnlyOffice调用逻辑
- winform 子控件触发父控件事件
private void circlePanel_Click(object sender, EventArgs e) { var panel=sender as UIPanel; if (panel. ...
- Vue中的样式作用域
介绍对于Vue样式作用域的介绍 对于所有组件中的Css都是通用的 在未指定作用域之前 在A组件中定义的 {.h1{color:red}} 同样会在b组件中生效 如果在B组件中也定义了 h1元素. 虽然 ...
- 【QT】创建动态链接库及使用
创建动态链接库 创建一个项目 选择library的C++库,下一步. 选择共享库,输入动态库的名字,选择创建路径,下一步 选择编译环境,下一步 选择QTCore模块,该模块提供核心的非图形用户接口功能 ...
- python菜鸟学习 : 16 pymongo和openpyxl的联合使用
# -*- coding: utf-8 -*-import pymongo, openpyxl, time# pymongo#条件删选mongodb数据def mongodb_expoter(db_n ...
- oracle job的使用
select job, next_date, next_sec, failures, broken from user_jobs; create or replace sequence END_RES ...
- php对接飞书机器人报警接口
<?php function request_by_curl($remote_server, $post_string) { $ch = curl_init(); curl_setopt($ch ...
- 将本地文件推送到Gitee仓库
完整的步骤 1.在gitee中创建仓库 2.下载.安装git 3.推送文件到gitee 推送文件到gitee 1.在要上传的文件夹空白处,点击右键,选择 git bash here 2.输入 git ...