很久没有接触Mysql了。
今天心血来潮,突然想了解一下Mysql列转行,看了一些文章,重点不清晰,遂有下文!
Mysql官网、 社区版下载( Windows版_mysql.8.0.31下载 )
Mysql内部提供了列转行的三个函数,分别是:
CONCAT(str1,str2,...)
CONCAT_WS(separator,str1,str2,...)
GROUP_CONCAT(expr)
数据如下,简单明了。
#1、查看原始数据
select * from student;
如上图所示,3条数据,足以说明问题。
首先,看到该函数的参数,str1和str2,立刻有种冲动,这两个参数应该看是任意字符串。
select CONCAT('aaa',',','bbb') as info from dual;
效果如图所示:concat可以用来拼接任意字符串,并自定义分隔符!
select CONCAT(s.id,',',s.name,',',s.age) as infos from student s;
3、 注意事项
如果,仅仅是想把表中单列数据,转换为一行,concat函数,就显得有些力不从心了,需要用到group_concat函数,下面第三小节,会有介绍!
从语法得知,separator是分隔符,后面str1和str2等等,是拼接字段。
不难理解,该函数只需指定一次分隔符即可。
select CONCAT_WS('#',id,name,age ) as infos from student ;
注意:比较遗憾的是,该CONCAT_WS函数依然不能让单列,转行!
术业有专攻,单例转行需下面的GROUP_CONCAT函数!
select GROUP_CONCAT(name) as names from student ;
说明:本案例是对该函数简单的演示,sql后面依然可以带where group by等条件语句。
select GROUP_CONCAT('111',name) as names from student ;
select GROUP_CONCAT(name,'222') as names from student ;
select GROUP_CONCAT('111',name,'222') as names from student ;
运行结果:
111succ,111chouniu,111succ
succ222,chouniu222,succ222
111succ222,111chouniu222,111succ222
Oracle常用的列转行
select * from emp;
--方法一:使用concat函数,该函数只能有两个参数(不可以自定义分隔符),但是它允许套用
select concat(empno,ename) from emp;
SELECT CONCAT(CONCAT('A', 'B'),'C')FROM dual;
--可以合并任意多个列为一行
select empno || ',' ||ename from emp;
--单列合并为一行,默认分隔符为逗号,如果想制定分隔符,则需要用replace函数协助
select wm_concat(ename) from emp;
select replace(wm_concat(ename),',','|') from emp;
至此,CONCAT、CONCAT_WS、GROUP_CONCAT三个函数的使用,基本介绍清楚,当然在实际开发中,场景会复杂很多。
欣慰的是,有了这三个函数的辅助,后期实现更为复杂的行转列,也将是如虎添翼!
MySql知识点太多,后期将会推出更多精要的mysql知识点,不出则已,出必为精品,不废话!
如果觉得有用,欢迎留言、点赞、收藏!