mysql高级查询实例:行列转换、一行多行转换

想看更多的高级查询语句,可以看我之前的高阶常用函数超详细总结,真的,看完,你就学会80%的高级查询语法了。
传送门:
万字掌握MYSQL常用函数

一、行列转换

有些人听到可能会想到就是把第n行转为第n列,说的也不是没什么道理,但在SQL语句查询中,并非这样。行列转换是企业面试中经常会遇到的一大考点,那SQL中的行列转换到底是什么呢?相信大家看到下面的图片就明白了。
mysql高级查询实例:行列转换、一行多行转换_第1张图片

1、行转列:聚合函数+CASE WHEN / IF()语句

'''思路:
1、行转列明显行数减少了并且对姓名进行了去重,因此首先对姓名进行分组;
2、分组后返回的是姓名及三科分数,每科分数相对应一列,因此利用聚合函数和控制函数条件筛选,当subject=语文时返回语文成绩,subject=数学时返回数学成绩 ,subject=语英语时返回英语成绩 
'''
select name
      ,max(case when subject = '语文' then score end) as `语文`
	  ,max(case when subject = '数学' then score end) as `数学`
	  ,max(case when subject = '英语' then score end) as `英语`
from stu_score1 
group by name 

2、列转行:union

'''思路:
列转行就是把所有属性一样的某些列转为同一列,行数增加;我们可以先把语文成绩、数学成绩、英语成绩分别的筛选出来,再纵向连接。
'''
select name,'语文' as subject, 语文 as score from stu_score2
union 
select name,'数学' as subject, 数学 as score from stu_score2
union 
select name,'英语' as subject, 英语 as score from stu_score2
  • MYSQL的列转行目前我也只会这一种方法,如果有更好更方便的可以私信或留言哦。
  • Hive语句中有自己独有的行列转换语句,大家有兴趣可以学习学习。

二、一行多行转换

mysql高级查询实例:行列转换、一行多行转换_第2张图片

  • 看起来其实和行列转换是差不多的,只是这里并没有考虑到其他值,更像是分组后的字符串连接。

1、一行变多行:

select name,substring_index(concat_sub,',',1) as subject 
from stu_score3 
union
select name,substring_index(concat_sub,',',-1) as subject 
from stu_score3 
union
select name,substring_index(substring_index(concat_sub,',',2),',',-1) as subject 
from stu_score3 
 这里讲一下substring_index(字符串,分隔符,分割符索引n)函数
若n>0,则输出第n个分隔符之前的所有字符;
若n<0,将字符串从后往前看,则输出倒数第n个分隔符之后的所有字符。
例如:
substring_index('a,b,c,d,e', ',' , 2) 输出第二个分隔符前的所有字符 a,b
substring_index('a,b,c,d,e', ',' , -2)输出倒数第二个分隔符后的所有字符 d,e

2、多行变一行

# 由图可以看出,将name列分组后的subject列连接,字符串分组连接函数用group_concat()函数
select name
      ,group_concat(subject) as concat_sub  # 默认','分割字符
	  ,group_concat(subject SEPARATOR ';') con_sub # 指定';'分割字符
from stu_score1
group by name

你可能感兴趣的:(MYSQL,数据分析,mysql,sql,数据库,大数据)