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`;
结果:
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中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;
结果:
上述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. 总结