CONCAT() 与 CONCAT_WS() 函数用于连接两个或多个串,但它们之间的基本区别是:
1、CONCAT_WS()函数可以执行级联与串之间的分离器沿,而在CONCAT()方法没有隔板的概念。
2、CONCAT()如果任何参数为NULL,则函数返回NULL;而CONCAT_WS()函数 分隔符为NULL时,函数将返回才NULL。
GROUP_CONCAT()函数是mysql中非常实用的函数,它可以将同一个分组下的行拼接在一起。其完整语法:
GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
随意创建一张表,如下:
CREATE TABLE `artist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`art_name` varchar(50) DEFAULT NULL,
`art_age` int(11) DEFAULT NULL,
`art_sex` varchar(50) DEFAULT NULL,
`art_addr` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;
INSERT INTO `artist` VALUES ('1', '靳东', '30', '男', '北京');
INSERT INTO `artist` VALUES ('2', '梁朝伟', '24', '男', '上海');
INSERT INTO `artist` VALUES ('3', '刘德华', '19', '男', '重庆');
INSERT INTO `artist` VALUES ('4', '成龙', '32', '男', '重庆');
INSERT INTO `artist` VALUES ('5', '雷佳音', '26', '男', '成都');
INSERT INTO `artist` VALUES ('6', '梅婷', '22', '女', '重庆');
INSERT INTO `artist` VALUES ('7', '周润发', '22', '男', '贵州');
INSERT INTO `artist` VALUES ('8', '周星驰', '28', '男', '海南');
INSERT INTO `artist` VALUES ('9', '贾玲', '26', '女', '上海');
INSERT INTO `artist` VALUES ('10', '张小斐', '17', '女', '贵阳');
INSERT INTO `artist` VALUES ('11', '袁泉', '26', '女', '上海');
INSERT INTO `artist` VALUES ('12', '马伊琍', null, '女', '北京');
SELECT * FROM artist;
?
CONCAT语法:
功能:将多个字符串连接成一个字符串。
语法:concat(str1,str2,...)
示例:
将每位明星的姓名、年龄、性别、地址连城字符串输出
SELECT id,CONCAT(art_name,art_age,art_sex,art_addr) FROM artist;
?
因为马伊琍art_age值为null,CONCAT()函数返回NULL。
CONCAT_WS语法:
表示concat with separator,即有分隔符的字符串连接。
功能:和concat()一样,将多个字符串连接成一个字符串,但可以指定分隔符。
语法:concat_ws(separator, str1, str2, ...)
和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL;但会因为 分隔符为NULL,函数返回NULL。
示例:
将每位明星的姓名、年龄、性别、地址连城字符串输出,并逗号分隔
SELECT id,CONCAT_WS(',',art_name,art_age,art_sex,art_addr) FROM artist;
??
GROUP_CONCAT语法:
group by?查询语句中,select?指定的查询字段,只能是?group by?语句的后面的字段,或包含在聚合函数中。
功能 :将group by 产生的同一个分组中的值连接起来,返回一个字符串结果(但返回的结果有长度限制)。
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc] [separator 分隔符] )
说明:
? ? ? ? 通过使用distinct 可以排除重复值;
? ? ? ? 如果希望结果中的只进行排序,可以使用 order by 子句;
? ? ? ? separator 是一个字符串值,缺省值为 一个逗号。
示例
1、以art_addr分组,把art_name字段的值拼成一行,逗号隔开(默认)。
SELECT art_addr, GROUP_CONCAT(art_name) AS names FROM artist GROUP BY art_addr;
?
2、以art_addr分组,把art_name字段值拼成一行,分号隔开,按art_age倒叙排列
SELECT art_addr, GROUP_CONCAT(art_name ORDER BY art_age DESC SEPARATOR ';') AS names FROM artist GROUP BY art_addr;
?
?示例:
根据art_addr分组,将art_name,art_age用“|”分隔,拼接“实力派”,并换行。按年龄倒叙
SELECT art_addr, GROUP_CONCAT(CONCAT(art_name,' | ' ,art_age, ' | ', '实力派') ORDER BY art_age DESC SEPARATOR '\n') AS names FROM artist GROUP BY art_addr;