[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 ...
随机推荐
- 其他6-break,continue,exit,return区别
break.continue.exit.return的区别 break 跳出整个循环语句 continue 跳过本次循环,进入下一次循环语句 exit n 退出当前shell,并返回状态值 retur ...
- 编译报错Could NoT find Threads (missing: Threads FOUND)
解决方法1: 原来的命令行加上-lpthread 解决方法2: -DCMAKE_THREAD_LIBS_INIT=-lpthread
- flex_bison
flex_bison flex flex词法分析器,可以利用正则表达式来生成匹配相应字符串的C语言代码,其语法格式基本同Lex相同.单词的描述称为模式(Lexical Pattern),模式一般用正规 ...
- ElementUI Select下拉框定位问题!
今天遇到了下拉不跟随文本框滚动的问题 参考官方手册添加参数: popper-append-to-body="false" 无效[内心很无语]继续检查向上推,查看html样式,发现了 ...
- vscode中配置代码片段
首先我们需要把要配置的代码复制一下,如: 然后我们进入https://snippet-generator.app/网站, 进入网站之后就把你复制的代码粘贴到左边的框里面,然后就是代码的类型和命名了 写 ...
- VIM、VI编辑中一个Tab设置为4个空格
配置方式 配置方式主要两种: 当前用户目录下创建或修改~/.vimrc Root用户下修改/etc/virc 和 /etc/vimrc 在文件末尾添加如下内容: set ts=4 set softta ...
- CCPC2021 广州 K. Magus Night
CCPC2021 广州 K. Magus Night 题意 给定整数区间 \([1,m]\) ,从中可重复的选择 \(n\) 个数,形成一个数列 \(\{a_n\}\) .问:所有满足 \(\gcd( ...
- 推荐一个 python学习网站
kaggle python课程: https://www.kaggle.com/learn/python 知乎有个博主在专栏放了课程的中文版: https://www.zhihu.com/people ...
- shell语法5-判断语句、循环语句、函数
一.判断语句 if-then形式类似于C/C++中的if-else语句. 1.单层if命令格式:if conditionthen 语句1 语句2 ...fi 2.单层if-else命 ...
- vue2中底层响应式数据实现
<input type="text" id="textInput" />输入:<span id="textSpan"> ...