侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 292 篇文章
  • 累计创建 132 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

MySQL中concat、concat_ws、group_concat函数的用法

孔子说JAVA
2022-09-09 / 0 评论 / 0 点赞 / 41 阅读 / 3,227 字 / 正在检测是否收录...

在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;

0

评论区