MySQL中concat以及group_concat的使用

参考文章
https://blog.csdn.net/Mary19920410/article/details/76545053
准备数据

create database test;
use test;
DROP TABLE IF EXISTS `concat`;
CREATE TABLE `concat` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `singin` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `score` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `concat` VALUES ('1', '小明', '2018-11-09 16:59:17', '1', '1', '0');
INSERT INTO `concat` VALUES ('2', '小王', '2018-11-09 16:59:46', '3', '0', '0');
INSERT INTO `concat` VALUES ('3', '小丽', '2018-11-09 17:00:50', '2', '1', '0');
INSERT INTO `concat` VALUES ('4', '小王', '2018-11-09 17:01:18', '4', '0', '0');
INSERT INTO `concat` VALUES ('5', '小明', '2018-11-09 17:01:42', '4', '1', '0');
INSERT INTO `concat` VALUES ('6', '小明', '2018-11-09 17:02:08', '2', '0', '0');
INSERT INTO `concat` VALUES ('7', null, '2018-11-09 17:02:37', '0', '0', null);
INSERT INTO `concat` VALUES ('8', 'maryleo', '2018-11-09 17:03:01', '0', '1', '60');
INSERT INTO `concat` VALUES ('9', 'nancysun', '2018-11-09 17:03:24', '0', '1', '60');

concat()函数的使用

将表中的多个列,拼接为一个列。
如果该列中有一个列的值为null,那么该列全部显示为null。
t_hrm_accountinfo 表中有如下的几列
MySQL中concat以及group_concat的使用
使用concat进行检索
·SELECT CONCAT(Account,", “,STATUS,”, ", RealName) info from t_hrm_accountinfo ·
结果如下图。
MySQL中concat以及group_concat的使用
可以看到检索的结果把Account Status RealName 这几列合并在了info这一列中。
如果concat中的列,有一列的数据在当前行为null,那么这一行的数据直接显示为null。
例如staffID在表中的数据为null, 在concat中填写了staffid
SELECT CONCAT(Account,", ",STATUS,", ", RealName,staffID) info from t_hrm_accountinfo;
MySQL中concat以及group_concat的使用
这个是concat的缺点之一, 同时用分隔符也很麻烦。 这个时候就需要concat_ws()出场了。

concat_ws()

CONCAT_WS() 函数第一个为分隔符,后面为查询的列。即使查询的列中有null值,这一行也不显示为null
SELECT CONCAT_WS(" ," ,Account,STATUS,RealName,staffID) info from t_hrm_accountinfo;
MySQL中concat以及group_concat的使用
如果分隔符为null, 那么返回的结果全部为null
SELECT CONCAT_WS(null ,Account,STATUS,RealName,staffID) info from t_hrm_accountinfo;
MySQL中concat以及group_concat的使用

group_concat()函数

SELECT name ,min(id) FROM concat GROUP BY name;
MySQL中concat以及group_concat的使用
SELECT name,id from concat ORDER BY name;
MySQL中concat以及group_concat的使用
group_concat()
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

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

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
使用group_concat()和group by显示相同名字的人的id号:

SELECT `name`,GROUP_CONCAT(id) ids from concat GROUP BY `name`;

MySQL中concat以及group_concat的使用
将上面的id号从大到小排序,且用’_'作为分隔符:

SELECT name ,GROUP_CONCAT(id order by id desc SEPARATOR '_') ids  from concat GROUP BY name;

MySQL中concat以及group_concat的使用
注意 ,从大到小降序id,并不是从9 到1排序, 而是名字相同的人的id,内部进行排序.

上面的查询中显示了以name分组的每组中所有的id。接下来我们要查询以name分组的所有组的id和score:

SELECT name ,GROUP_CONCAT(CONCAT_WS('-',id,score) ORDER BY id asc) id_score from concat GROUP BY name;

MySQL中concat以及group_concat的使用