iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >一文弄懂MYSQL如何列转行
  • 379
分享到

一文弄懂MYSQL如何列转行

mysql列转行逗号隔开mysql列转行sqlmysql行列转换函数 2022-06-16 17:06:08 379人浏览 独家记忆
摘要

目录一、需求:二、如何实现1)首先看我们的静态sql2)那么就有人问了,如果我有100门课程不是要写100次名称,这也太麻烦了?3)这样每次都写一长串sql也很麻烦?总结一、需求: 有三张表,学生表、成绩表和课程表,我们

一、需求:

有三张表,学生表、成绩表和课程表,我们可以通过连表查询出学生姓名、课程及对应的成绩: 所需表sql

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `s_id` varchar(20) NOT NULL DEFAULT '',
  `s_name` varchar(20) NOT NULL DEFAULT '',
  `s_birth` varchar(20) NOT NULL DEFAULT '',
  `s_sex` varchar(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`s_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', '赵雷', '1990-01-01', '男');
INSERT INTO `student` VALUES ('02', '钱电', '1990-12-21', '男');
INSERT INTO `student` VALUES ('03', '孙风', '1990-05-20', '男');
INSERT INTO `student` VALUES ('04', '李云', '1990-08-06', '男');
INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01', '女');
INSERT INTO `student` VALUES ('06', '吴兰', '1992-03-01', '女');
INSERT INTO `student` VALUES ('07', '郑竹', '1989-07-01', '女');
INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20', '女');
 
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `c_id` varchar(20) NOT NULL DEFAULT '',
  `c_name` varchar(20) NOT NULL DEFAULT '',
  `t_id` varchar(20) NOT NULL,
  PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('01', '语文', '02');
INSERT INTO `course` VALUES ('02', '数学', '01');
INSERT INTO `course` VALUES ('03', '英语', '03');
 
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `s_id` varchar(20) NOT NULL DEFAULT '',
  `c_id` varchar(20) NOT NULL DEFAULT '',
  `s_score` int(3) DEFAULT NULL,
  PRIMARY KEY (`s_id`,`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('01', '01', '80');
INSERT INTO `score` VALUES ('01', '02', '90');
INSERT INTO `score` VALUES ('01', '03', '99');
INSERT INTO `score` VALUES ('02', '01', '70');
INSERT INTO `score` VALUES ('02', '02', '60');
INSERT INTO `score` VALUES ('02', '03', '80');
INSERT INTO `score` VALUES ('03', '01', '80');
INSERT INTO `score` VALUES ('03', '02', '80');
INSERT INTO `score` VALUES ('03', '03', '80');
INSERT INTO `score` VALUES ('04', '01', '50');
INSERT INTO `score` VALUES ('04', '02', '30');
INSERT INTO `score` VALUES ('04', '03', '20');
INSERT INTO `score` VALUES ('05', '01', '76');
INSERT INTO `score` VALUES ('05', '02', '87');
INSERT INTO `score` VALUES ('06', '01', '31');
INSERT INTO `score` VALUES ('06', '03', '34');
INSERT INTO `score` VALUES ('07', '02', '89');
INSERT INTO `score` VALUES ('07', '03', '98');
SELECT s.s_id,s.s_name,c.c_name,sc.s_score 
FROM student s 
LEFT JOIN score sc on sc.s_id = s.s_id 
LEFT JOIN course c on c.c_id = sc.c_id

一文弄懂MYSQL如何列转行

好的,现在呢我们要把课程名称呢变成横行呢?

一文弄懂MYSQL如何列转行

二、如何实现

1)首先看我们的静态SQL

关联成绩表课程表查询学生各科课程成绩

SELECT s.s_id,s.s_name,c.c_name,sc.s_score
FROM student s
LEFT JOIN score sc on sc.s_id=s.s_id
LEFT JOIN course c on c.c_id = sc.c_id;

IF(s1,s2,s3)表达式,类似三木运算符取值,s1值为真取s2值,假取s3个值,最后可得到某一科成绩

SELECT  p.s_id,p.s_name, p.c_name,p.c_name = '数学',
IF(p.c_name = '数学',p.c_name,NULL)c_name,IF(p.c_name = '数学',p.s_score,NULL)s_score
FROM (
	SELECT s.s_id,s.s_name,c.c_name,sc.s_score
	FROM student s
	LEFT JOIN score sc on sc.s_id=s.s_id
	LEFT JOIN course c on c.c_id = sc.c_id	)p;

然后我们分组且用MAX函数获取每个学生的数学课程的成绩,替换这一课的字段名称

SELECT  p.s_id,
        p.s_name, 
        MAX(IF(p.c_name = '数学', p.s_score, NULL)) AS 数学
FROM (
	SELECT s.s_id,s.s_name,c.c_name,sc.s_score
	FROM student s
	LEFT JOIN score sc on sc.s_id=s.s_id
	LEFT JOIN course c on c.c_id = sc.c_id	)p
GROUP BY p.s_id;

获取所有人各科成绩

SELECT  p.s_id,
        p.s_name, 
        MAX(IF(p.c_name = '数学', p.s_score, NULL)) AS 数学,
        MAX(IF(p.c_name = '语文', p.s_score, NULL)) AS 语文,
        MAX(IF(p.c_name = '英语', p.s_score, NULL)) AS 英语
FROM (
	SELECT s.s_id,s.s_name,c.c_name,sc.s_score
	FROM student s
	LEFT JOIN score sc on sc.s_id=s.s_id
	LEFT JOIN course c on c.c_id = sc.c_id	)p
GROUP BY p.s_id;

一文弄懂MYSQL如何列转行

2)那么就有人问了,如果我有100门课程不是要写100次名称,这也太麻烦了?

接下来请看动态SQL

我们的动态sql是拼接实现的, 主要就是拼接我们的课程成绩那一句, 所以要先看一下CONCAT函数拼接课程语句

SELECT c_name,CONCAT( 'MAX(IF(p.c_name = ''', c_name, ''', c.s_score, NULL)) AS ', c_name ) FROM course c;

是的,结果就是上面要的MAX函数

一文弄懂MYSQL如何列转行

然后我么可以用GROUP_CONCAT()函数把这些内容拼接成一句

SELECT GROUP_CONCAT(DISTINCT c_name,CONCAT( 'MAX(IF(p.c_name = ''', c_name, ''', c.s_score, NULL)) AS ', c_name )) FROM course c;

一文弄懂MYSQL如何列转行

接下来,拼接sql实现需求

-- 1.定义一个sql变量
SET @sql = NULL;
 
-- 2.把我们的查询课程的sql赋给变量
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(p.c_name = ''',c_name,''', p.s_score, NULL)) AS ',c_name)) INTO @sql
FROM course;
 
-- 3.拼接sql
SET @sql = CONCAT('SELECT  p.s_id, p.s_name, ', @sql ,'
			FROM (SELECT s.s_id,s.s_name,c.c_name,sc.s_score 
			FROM student s 
			LEFT JOIN score sc on sc.s_id=s.s_id 
			LEFT JOIN course c on c.c_id = sc.c_id)p 
			GROUP BY p.s_id');
 
-- 预处理语句 
PREPARE stmt FROM @sql;
-- 执行
EXECUTE stmt;
-- 销毁
DEALLOCATE PREPARE stmt;

一文弄懂MYSQL如何列转行

3)这样每次都写一长串sql也很麻烦?

好的 那么我们来封装成存储过程

-- 1、创建无参存储过程
delimiter $$
CREATE PROCEDURE getStudentRow()
BEGIN
    ------把要执行的sql放在这里就可以了
		SET @sql = NULL;
		SELECT
        GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(p.c_name = ''',c_name,''', p.s_score, NULL)) AS ',c_name)) 
        INTO @sql FROM course;
    SET @sql = CONCAT('SELECT  p.s_id, p.s_name, ', @sql ,'
    	FROM (SELECT s.s_id,s.s_name,c.c_name,sc.s_score 
    	FROM student s 
    	LEFT JOIN score sc on sc.s_id=s.s_id 
    	LEFT JOIN course c on c.c_id = sc.c_id)p 
    	GROUP BY p.s_id');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    ------把要执行的sql放在这里就可以了
END$$;
delimiter;
 
-- 查询存储过程
SHOW PROCEDURE STATUS;
 
-- 调用
CALL getStudentRow();

一文弄懂MYSQL如何列转行

这样每次直接调用就可以了?

总结

到此这篇关于Mysql如何列转行的文章就介绍到这了,更多相关mysql列转行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: 一文弄懂MYSQL如何列转行

本文链接: https://www.lsjlt.com/news/32973.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文弄懂MySQL索引创建原则
    目录一、适合创建索引1、字段的数值有唯一性限制2、频繁作为Where查询条件的字段3、经常Group by和Order by的列4、Update、Delete的w...
    99+
    2024-04-02
  • 一篇文章弄懂MySQL查询语句的执行过程
    前言 需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX  这样的SQL,那么当我们向...
    99+
    2024-04-02
  • 一文弄懂MySQL中redo log与binlog的区别
    目录前言1. 什么是redo log?1.1 redo日志文件名1.2 影响redo log参数1.3 redo log大小怎么设置?2. 什么是binlog2.1 binlog文件...
    99+
    2024-04-02
  • 一文搞懂MySQL执行流程
    目录 一、MySQL技术架构 二、执行流程 1.连接器 2.查询缓存 3.解析SQL 4.执行SQL 总结 一、MySQL技术架构   可以看到,MySQL的技术架构共分为两层:Server层和存储引擎层 Server 层负责建立连接、分...
    99+
    2023-10-27
    mysql 面试 后端 数据库
  • 学习mysql 如何行转列与列传行
    目录一、行转列—case+groupby二、列转行——union一、行转列— case+group by mysql>...
    99+
    2024-04-02
  • 一文弄懂C语言如何实现单链表
    目录一、单链表与顺序表的区别:一、顺序表:二、链表二、关于链表中的一些函数接口的作用及实现1、头文件里的结构体和函数声明等等2、创建接口空间3.尾插尾删4、头插头删 5、单...
    99+
    2024-04-02
  • mysql的行如何转为列
    这篇“mysql的行如何转为列”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql的行...
    99+
    2024-04-02
  • 一文带你看懂MySQL执行计划
    目录前言explain/desc 用法explain/desc 输出详解一、id ,select 查询序列号二、select_type,查询语句类型三、table,查询涉及...
    99+
    2024-04-02
  • 一文看懂python如何执行cmd命令
      概要   “ 在进行Python编程时,经常需要使用到操作系统的命令行,这就要求我们学会如何使用Python执行cmd命令。”   Python执行cmd命令的几种方法   Python是一种强大而灵活的编程语言,它可以很方便地执行...
    99+
    2023-09-03
    python 开发语言
  • SQL如何实现行转列和列转行
    这篇文章给大家分享的是有关SQL如何实现行转列和列转行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。行列互转,是一个经常遇到的需求。实现的方法,有case when方式和2005...
    99+
    2024-04-02
  • pandas如何优雅的列转行及行转列详解
    目录一、列转行1、背景描述2.方法描述2.1 方法12.2 方法22.3 方法32.4 方法43 思考与总结4 思维延伸4.1 例子14.2 例子2二、行转列1.准备数据2.行转列实...
    99+
    2024-04-02
  • 一个案例彻底弄懂如何正确使用mysql inndb联合索引
    有一个业务是查询最新审核的5条数据 SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 ...
    99+
    2024-04-02
  • unity可执行文件如何弄
    要创建Unity可执行文件,您需要按照以下步骤操作: 在Unity编辑器中构建您的项目: 打开您的Unity项目,并确保您已经...
    99+
    2024-03-02
    unity
  • Pandas.DataFrame行和列如何转置
    本篇内容主要讲解“Pandas.DataFrame行和列如何转置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pandas.DataFrame行和列如何转置”吧!如果要交换(转置)pandas....
    99+
    2023-07-05
  • 一文搞懂MySQL XA如何实现分布式事务
    目录前言XA 协议如何通过MySQL XA实现分布式事务前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开...
    99+
    2024-04-02
  • 一文看懂新能源汽车行业如何践行智能制造
    当前中国的新能源汽车制造呈现出比以往任何时期都更加繁荣的景象,新能源汽车为汽车制造业带来的变革效应正在日益显现。就整车生产而言,固有的传统汽车厂商正在加码新能源汽车,在国家政策鼓励下,全新的新能汽车企业正在涌现。从新能源车全产业链的角度来看...
    99+
    2023-06-05
  • MySQL中列如何以逗号分隔转成多行
    目录mysql列以逗号分隔转成多行场景解决方案总结MySQL列以逗号分隔转成多行 业务场景: 在数据库中,有一张的一个字段存储方式是采用以逗号分隔存储多个值,现在需要将其进行拆分成多个独立的值,与另外一张字典表进行关联,...
    99+
    2023-02-07
    MySQL逗号分隔 MySQL逗号分隔多行 MySQL逗号
  • 如何进行SQL中PIVOT行列转换
    这篇文章主要讲解了“如何进行SQL中PIVOT行列转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何进行SQL中PIVOT行列转换”吧!PIVOT通过将...
    99+
    2024-04-02
  • 如何快速看懂MySQL执行计划
    这篇文章主要介绍了如何快速看懂MySQL执行计划的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何快速看懂MySQL执行计划文章都会有所收获,下面我们一起来看看吧。通常查询慢查...
    99+
    2023-03-15
    mysql
  • MySQL-如何分库分表?一看就懂
    一、为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),主库容量肯...
    99+
    2023-09-04
    mysql java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作