想看更多的高级查询语句,可以看我之前的高阶常用函数超详细总结,真的,看完,你就学会80%的高级查询语法了。
传送门:
万字掌握MYSQL常用函数
有些人听到可能会想到就是把第n行转为第n列,说的也不是没什么道理,但在SQL语句查询中,并非这样。行列转换是企业面试中经常会遇到的一大考点,那SQL中的行列转换到底是什么呢?相信大家看到下面的图片就明白了。
'''思路:
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
'''思路:
列转行就是把所有属性一样的某些列转为同一列,行数增加;我们可以先把语文成绩、数学成绩、英语成绩分别的筛选出来,再纵向连接。
'''
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
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
# 由图可以看出,将name列分组后的subject列连接,字符串分组连接函数用group_concat()函数
select name
,group_concat(subject) as concat_sub # 默认','分割字符
,group_concat(subject SEPARATOR ';') con_sub # 指定';'分割字符
from stu_score1
group by name