面试题mysql行转列_【数据库】SQL经典面试题 - 行列转换二 - 列转行

本帖子是行转列的一个逆向操作——列转行,看下面一个面试题

面试题2: 柠檬班第30期学生要毕业了,他们的Linux、MySQL、Java成绩数据表 tb_lemon_grade_column中, 表中字段student_name,Linux,MySQL,Java分别表示学生姓名、Linux成绩、MySQL成绩、Java成绩, 数据图1所示。请写出一条SQL,将图1的数据变成图2的形式(列转行)如下图示:

615ad774ba8fdbc565864f6c179620d0.png

1:使用上节课学的知识,获得以列的形式展示的成绩数据(行转列)

SELECT student_name,SUM(CASE COURSE when'Linux'THEN SCORE ELSE 0END)as'Linux',SUM(CASE COURSE when'MySQL'THEN SCORE ELSE 0END)as'MySQL',SUM(CASE COURSE when'Java'THEN SCORE ELSE 0END)as'Java'FROM tb_lemon_grade

GROUP BY student_name;

结果如下:

be407e65fa3ddb66e94f86203ea3fb84.png

2:使用导出功能,将数据导入到Excel

7f577dd7696d67c2cf0d4000a64c15bb.png

点击下一步,选择保存位置,输入保存的文件名

f64253ff23100aa110e47f6d549d2fc8.png

点击下一步,点击开始,讲数据导入到本地

3:使用导入功能,将导出的Excel表导入到数据库

选择表,点击右键选择导入向导

f13e4035fc569903f5f11315074452f2.png

选择Excel文件,点击下一步,选择刚才保存的Excel文件,输入要保存的表,进行导入

5a5e6d7626c015350b2bb53e76456dad.png

4:导入完成,就生成了一个表,查看下数据

5b27681033ad4fd2c90e36df511193c3.png

5:上面是使用导入本地文件的方式新建了一个表,并且把文件的数据也导入进来了,

如果是数据本身已经存在数据库中,我们还有更简单的方法,使用的是创建表的CREATE TABLE语法,可以新建表,并且把结果集的数据也会初始化到新建表中,如下所示:

CREATE TABLE new_tables(SELECT student_name,MAX(IF(COURSE ='Linux',SCORE,0))'Linux',MAX(IF(COURSE ='MySQL',SCORE,0))'MySQL',MAX(IF(COURSE ='Java',SCORE,0))'Java'FROM tb_lemon_grade

GROUP BY student_name);

6:怎么列传行呢?使用UNION ALL,然后行转列

SELECT student_name,'linux'course,linux score FROM tb_lemon_student2

UNION ALL

SELECT student_name,'MySQL'course,MySQLscore FROM tb_lemon_student2

UNION ALL

SELECT student_name,'Java'course,Javascore FROM tb_lemon_student2;

7:我们想排下序怎么办呢? 采用子查询的方式(注意子查询中的别名a,一定要写上别名)

SELECT student_name,'linux'course,linux score fromtb_lemon_student2

SELECT *FROM (UNION ALL

SELECT student_name,'MySQL'course,MySQLscore fromtb_lemon_student2

UNION ALL

SELECT student_name,'Java'course,Javascore fromtb_lemon_student2)a ORDER BY student_name DESC;

结果如下:

3f21203b7810ab968a7427751e06a8f6.png

今天就分享到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值