1. concat()
功能:将多个字符串连接成一个字符串。
语法:concat(str1, str2, ...)
说明:返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
用法:
(1)不设置分隔符
mysql> select concat('001','小明','85') as result;
+-------------+
| result |
+-------------+
| 001小明85 |
+-------------+
(2)设置 '-' 作为分隔符
mysql> select concat('001','-','小明','-','85') as result;
+---------------+
| result |
+---------------+
| 001-小明-85 |
+---------------+
现在问题来了,本题中有3个字段,需设置2次分隔符,操作比较繁琐。如果有更多字段呢?
所以接下来介绍concat_ws(),不管有多少个字段,只需设置1次分隔符即可。
2. concat_ws()
功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)
语法:concat_ws(separator, str1, str2, ...)
说明:第一个参数指定分隔符,不可省略。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
用法:
(1)设置 '-' 作为分隔符
mysql> select concat_ws('-','001','小明','85') as result;
+---------------+
| result |
+---------------+
| 001-小明-85 |
+---------------+
(2)设置 ' ' (空格)作为分隔符
mysql> select concat_ws(' ','001','小明','85') as result;
+---------------+
| result |
+---------------+
| 001 小明 85 |
+---------------+
假如每个学生都有几个科目(subject 01/02)的成绩,这样同一个学号(id:001)、同一名字(name:小明)会出现多次,只是最后一个字段分数不同(score:85/90)。如何让每个学号、名字都只出现一次呢?
接下来介绍group_concat(),结合group by使用。
3. group_concat()
功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
用法:
mysql> select concat_ws('-',id,name,group_concat(score order by subject separator'-')) as result
from grade
group by name;
result:
001-小明-85-90