mysql 行转列查询优化_行转列及列转行查询

本文介绍了在数据库开发中如何利用SQL进行行转列和列转行的操作。对于行转列,通过使用IF函数和SUM函数结合GROUP BY,将同一列的多行内容转化为不同列并分组显示。例如,将学生的语文、数学、英语成绩分别显示为独立的列。而对于列转行,利用UNION ALL将每个学生不同科目的成绩拆分为单独的记录。注意UNION和UNION ALL的区别在于是否去除重复记录和是否排序,以及效率上的差异。
摘要由CSDN通过智能技术生成

开发过程中常遇到行转列或是列转行的问题,即需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。

一、行转列:将原来同一列下多行的不同内容作为多个字段,输出对应内容

数据库表中的内容:

9d2fbbd120b16ba54ab45db17360c00d.png

转换后:

42ffe791e9cd005169ff4f78fc2192c8.png

解析:

行转列是将原来的subject字段的多行内容选出来,作为结果集中的不同列,并根据code进行分组显示对应的score

mysql> select s.name 姓名,s.code 学号,

-> sum(if(e.subject='语文',e.score,0)) 语文成绩,

-> sum(if(e.subject='数学',e.score,0)) 数学成绩,

-> sum(if(e.subject='英语',e.score,0)) 英语成绩

-> from student s

-> left join exam e

-> on s.code=e.code

-> group by s.code;

①sum()函数是为了能够使用group by根据code进行分组,因为每一个student.code对应的exam.subject='语文'的记录只有一条,所以sum()的值就等于对应那一条记录的exam.score的值。

(正常情况下此记录都是只有一条,当然如果有多条的话,可以使用sum()、max()、avg()、min()等聚合函数也都可以达到行转列的效果)

②if(e.subject='语文',e.score,0)作为条件,即对所有经过group by s.code分组的e.subject='语文'的记录的e.score字段进行SUM()、MAX()、MIN()、AVG()操作,如果e.score没有值则默认为0。

(当然使用case when then作为条件进行信息提取也是OK的)

二、列转行:将sid的每个科目分数分散成一条记录显示

数据库中的表:

e8006d273895db580c9035ac66545f55.png

转换后:

cef7d579946ff891ee95dafeb54ab34a.png

解析:

使用union all将每个sname对应的多个科目的成绩的结果集加起来

mysql> select sname,sid,'语文' as subject,语文 as score from transcript

-> union all

-> select sname,sid,'数学' as subject,数学 as score from transcript

-> union all

-> select sname,sid,'英语' as subject,英语 as score from transcript

-> order by sname;

UNION与UNION ALL的区别:

1.对重复结果的处理:UNION会去掉重复记录,UNION ALL不会;

2.对排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合并;

3.效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值