vlambda博客
学习文章列表

MySQL中的字段拼接

本文举例简单说明以下三个函数

  • concat() 

  • concat_ws()

  • group_concat()

 1. 数据准备

创建如下表并插入数据待测试函数用
/*Table structure for table `users` */
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` ( `uid` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar(24) DEFAULT NULL, `age` tinyint DEFAULT NULL, `class` int DEFAULT NULL, PRIMARY KEY (`uid`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `users` */
insert into `users`(`uid`,`name`,`age`,`class`) values (1,'Jeremy',32,1),(2,'Melissa',32,1),(3,'Steve',12,2);


2. 函数详解示例

2.1 concat()函数

功能:将多个字符串连接成一个字符串。

语法:concat(str1, str2,...),返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

示例:

SELECT  CONCAT(`name`, `uid`) AS result FROM `USERS`;

结果:

如果想在字段间加分隔符,需要在每两个字段间都增加一个分隔符,比较麻烦,例如:

SELECT  CONCAT(`name`, '~', `uid`) AS result FROM `USERS`;

结果:

MySQL中的字段拼接


2.2 concat_ws()函数

功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

语法:concat_ws(separator, str1, str2, ...)

说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

示例:

SELECT  CONCAT_WS('---', `name`, `uid`) AS result FROM `USERS`;

结果:

MySQL中的字段拼接

注意:和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL。


2.3 group_concat()函数

功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] )

通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

示例:

SELECT  GROUP_CONCAT( `name`,`age`  ORDER BY `uid` DESC  SEPARATOR ';' ) AS result FROM `USERS` WHERE `age` > 30;

结果:

MySQL中的字段拼接

上述SQL的语义为:查询age大于30的用户,按照uid的降序,使用分隔符';'将name和age字段拼接。

该函数中的distinct,order by,separator都可以省略,最简化的使用为:

SELECT  GROUP_CONCAT(`name`) AS result FROM  `USERS`;

结果:

上述SQL的语义为:查询所有数据,并将name字段拼接。


TIPS:group_concat()函数通常与SQL的GROUP BY条件一并使用,例如:

SELECT  `class`, GROUP_CONCAT(`name`) AS result FROM `USERS` GROUP BY `class`;

结果:


3. 总结

函数很简单,多练练总能熟练掌握!配合其他函数,都能玩出花来~~