MySQL三种连接函数concat(),concat_ws(),group_concat()使用总结
测试表结构:
create table t
(
id int auto_increment primary key,
name varchar(20),
score int(3)
);
插入数据:
insert into t(name, score) values ('cj1', 85), ('cj2', 90), ('cj3', 95);
说明:concat()
函数,将多个字符串连接成一个字符串。返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
语法:concat(str1, str2,...)
,每个str可指定分隔符。
示例:
select concat(id, name, sorce) as info from t;
| info |
| 1cj185 |
| 2cj290 |
| 3cj395 |
select concat(id, ',', name, ',', sorce) as info from t;
| info |
| 1,cj1,85 |
| 2,cj2,90 |
| 3,cj3,95 |
由上示例,这样操作不太友好,若指定分隔符需要在每两个字符串之间增加’,’,于是有了以下函数:
说明:concat_ws()函数,将多个字符串连接成一个字符串,可以一次性指定分隔符。
语法:concat_ws(separator, str1, str2, …)
示例:
select concat_ws(',', id, name, sorce) as info from t;
| info |
| 1,cj1,85 |
| 2,cj2,90 |
| 3,cj3,95 |
(也能达到以上示例中的分割符效果)
注意:分隔符不能为null,如果为null,则返回结果为null。
select concat_ws(null, id, name, sorce) as info from t;
| info |
| null |
| null |
| null |
说明:GROUP_CONCAT()函数,将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )。
继续向测试表插入数据:
insert into t(name, score) values ('cj1', 86), ('cj2', 91)
select * from t;
| id | name | score |
| 1 | cj1 | 85 |
| 2 | cj2 | 90 |
| 3 | cj3 | 95 |
| 4 | cj1 | 86 |
| 5 | cj2 | 91 |
示例:
1、使用group_concat()和group by显示相同名字的人的score
select name, group_concat(score) from t group by name;
| name | group_concat(score) |
| cj1 | 85,86 |
| cj2 | 90,91 |
| cj3 | 95 |
2、将分组的的score从大到小排序,且用’_'作为分隔符
select name, group_concat(score order by score desc separator '_') from t group by name;
| name | group_concat(score order by score desc separator '_') |
| cj1 | 86_85 |
| cj2 | 91_90 |
| cj3 | 95 |
3、查询以name分组的所有组的id和score,每对数据用’_'作为分隔符
select name, group_concat(concat_ws('-', id, score) order by id) from t group by name;
| name | group_concat(concat_ws('-', id, score) order by id) |
| cj1 | 1-85,4-86 |
| cj2 | 2-90,5-91 |
| cj3 | 3-95 |