在MySQL中,concat()函数用于将两个或多个字符串拼接成一个字符串并返回,语法为 CONCAT(string1,string2, … ),该函数需要至少一个参数,否则会引起错误。concat()函数在拼接之前会将所有参数转换为字符串类型;如果任何参数为NULL,则CONCAT()函数返回NULL值。concat_ws()函数和concat()一样,但是可以指定分隔符。group_concat()函数是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
1、concat()函数
功能:将多个字符串连接成一个字符串。
语法:concat(str1, str2,…)
说明:返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
举例:
select concat (id, name, score) as 别名 from 表名;
如果 CONCAT()函数中有参数的值为null,则获取到的结果为null值。
# 下述语句的结果为 NULL
SELECT CONCAT('1,',NULL,'2');
# 下述语句的结果为 1,2
SELECT CONCAT('1,','','2'); 结果为 1,2
大部分情况下,我们不希望返回的结果为null,那该怎么解决呢?这里提供2种解决方案:
方案一: 使用 IFNULL() 函数,如果是NULL将其置为’'空字符串。
# 下述语句的执行结果:1,2
SELECT CONCAT('1,',IFNULL(NULL,''),'2');
方案二: 使用CONCAT_WS函数。指定有分隔符的字符串连接。
# 下述语句的执行结果:1,2
SELECT CONCAT_WS(',','1',NULL,'2'); 指定使用逗号进行分隔
CONCAT_WS(分隔符,参数1,参数2,…参数n)与CONCAT(参数1,参数2,…参数n)两个函数的区别:
- CONCAT():表示将字符串进行连接,拼接参数中存在NULL直接返回NULL
- CONCAT_WS():表示concat with separator,即有分隔符的字符串连接(分隔符不能为null),函数在执行的时候,会忽略null值。
2、concat_ws()函数
功能:和concat()一样,但是可以指定分隔符(concat_ws就是concat with separator)
语法:concat_ws(separator, str1, str2, …)
说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
举例:select concat (‘#’,id, name, score) as 别名 from 表名;
# 下述语句的执行结果:12
SELECT CONCAT_WS('','1',NULL,'2');
# 下述语句的执行结果:1,2
SELECT CONCAT_WS(',','1',NULL,'2'); 指定使用逗号进行分隔
3、group_concat()函数
功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。group_concat函数首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。由函数参数(字段名)决定要返回的列。
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator] )
- 使用distinct可以排除重复值;
- 如果需要对结果中的值进行排序,可以使用order by子句;
- separator是一个字符串值,默认为逗号。
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator分隔符是一个字符串值,缺省为一个逗号。
举例:
select name,group_concat(id order by id desc separator '#') as 别名 from 表名 group by name;
实战,有emp表如下:
create table emp(
emp_id int primary key auto_increment comment '编号',
emp_name char(20) not null default '' comment '姓名',
salary decimal(10,2) not null default 0 comment '工资',
department char(20) not null default '' comment '部门'
);
insert into emp(emp_name,salary,department) values
('张晶晶',5000,'财务部'),('王飞飞',5800,'财务部'),
('赵刚',6200,'财务部'),('刘小贝',5700,'人事部'),
('王大鹏',6700,'人事部'),('张小斐',5200,'人事部'),
('刘云云',7500,'销售部'),('刘云鹏',7200,'销售部'),
('刘云鹏',7800,'销售部');
查询一:
mysql> select group_concat(emp_name) from emp;
+----------------------------------------------------------------------------------------+
| group_concat(emp_name) |
+----------------------------------------------------------------------------------------+
| 张晶晶,王飞飞,赵刚,刘小贝,王大鹏,张小斐,刘云云,刘云鹏,刘云鹏 |
+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
查询二:
mysql> select department,group_concat(emp_name) from emp group by department;
+------------+-------------------------------+
| department | group_concat(emp_name) |
+------------+-------------------------------+
| 人事部 | 刘小贝,王大鹏,张小斐 |
| 财务部 | 张晶晶,王飞飞,赵刚 |
| 销售部 | 刘云云,刘云鹏,刘云鹏 |
+------------+-------------------------------+
3 rows in set (0.00 sec)
4、concat_ws()和group_concat()联合使用
题目:查询以name分组的所有组的id和score
举例:select name,group_concat(concat_ws(‘-’,id,score) order by id) as 别名 from 表名 group by name;
评论区