MySQL拼接字符串,GROUP_CONCAT 值得拥有

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL拼接字符串,GROUP_CONCAT 值得拥有

上一篇文章 跨表更新,看到自己写的SQL像个憨憨写了关于跨表个更新的内容。一年过的很快,文中后来的两位员工 馮大馮二 也要面对无情的 KPI 考核了,他们工作干的很不错,performance 分别是 4 和 5


微信图片_20220510162445.png


新需求来了,静悄悄的来了!!! 领导想要查看每个 performance 下都有谁,同时要求将这些人的名称要逗号拼接成一个字符串,也就是说要得到下面的结果:


微信图片_20220510162513.png


要将结果集中某个指定的列进行字符串拼接,这要怎么做呢?主角闪亮✨登场


GROUP_CONCAT(expr)


Mysql 官方文档 中,该函数被放在聚合函数章节,如果你要按照指定字段分组拼接,就要配合关键字 GROUP BY 来使用的


微信图片_20220510162555.png


定义


该函数返回一个字符串结果,该字符串结果是通过分组串联的 非NULL值

。如果没有非NULL值,则返回NULL。完整语法如下:


GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])


What? 这个语法看着太复杂了吧,别着急,下面会用例子慢慢说明逐一验证滴


使用案例


先完成文章开头的需求:


SELECT performance, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY performance;


zou是这个结果:


微信图片_20220510162703.png


到这里,领导给过来的需求就完成了😜


客官请留步,您点的菜还没上完呢......


我们是国际化的团队,我们的家乡遍布五湖四海


微信图片_20220510162736.png


领导想关怀一下员工,要查看公司全部员工的家乡都有哪些地方。员工们可能来自同一个地方,所以要将结果集去重复,DISTINCT 关键字就派上用场了


SELECT GROUP_CONCAT(DISTINCT home_town)
FROM employees;


来看结果:


微信图片_20220510162827.png


领导的关怀遍布五湖四海啊......


文案要改了,领导的关怀是遍布四海五湖的, 那么 ORDER BY 关键字就派上用场了


SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '领导关怀地区'
FROM employees;
-- 没我这么起变量的哈,还是汉语,我看你是疯了


微信图片_20220510162859.png


这里你看到 GROUP_CONCAT 函数拼接字符串默认的分隔符是逗号 ,, 领导不开心,逗号么的感情,要用❕才能体现出关怀的强烈, SEPARATOR 关键字就派上用场了


分组拼接的值之间默认分隔符是逗号(,)。要明确指定分隔符,需要使用 SEPARATOR 关键字,紧跟其后的是你想设置的分隔符。要完全消除分隔符,就在 SEPARATOR 关键字后面写 '' 就好了


SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '领导关怀地区'
FROM employees;


微信图片_20220510162953.png


SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '领导关怀地区'
FROM employees;


微信图片_20220510163013.png


这关怀到位了吧,你品,你细品!!!


领导的关怀能力也有限,拼接的字符串默认的最大长度是1024个字符,可以通过下面语句查看当前限制是多少:


show variables like 'group_concat_max_len';


微信图片_20220510163048.png


领导的能力可是飘忽不定的,所以我们可以灵活的设置这个值


SET [GLOBAL | SESSION] group_concat_max_len = val;


  • SESSION: 在当前对话中生效


  • GLOBAL:全局都生效


该语句在执行后,MySQL重启之前一直有作用,一旦重启 MySQL,则会恢复默认值


有时候 GROUP_CONCAT() 还要搭配 CONCAT_WS() 发挥出一点点威力,举个简单的例子


将消费者的名和姓用逗号进行分隔,然后再用 ; 进行分隔


SELECT
    GROUP_CONCAT(
       CONCAT_WS(', ', contactLastName, contactFirstName)
       SEPARATOR ';')
FROM
    customers;


这里是 CONCAT_WS()函数用法, 很简单,请自行查看吧......


注意⚠️


GROUP_CONCAT()函数返回单个字符串,而不是值列表。这意味着我们不能在 IN 运算符中使用GROUP_CONCAT()函数的结果,例如,在子查询中, 像这样:


SELECT
    id, name
FROM
    table_name
WHERE
    id IN GROUP_CONCAT(id);


总结


在许多情况下,我们都可以应用GROUP_CONCAT()函数产生出有用的结果,同时也可以结合其他函数发挥出更大的威力. 单招学会了,就要学会连招 combo 了


  • 如果你也像我一样刚知道这个知识点,还请点个「在看」


  • 如果你早都知道这个小儿科内容,还请留言送上「嘘声」


灵魂追问


  1. 聚合函数和 group by 搭配有哪些限制?


  1. 你能马上想到的聚合函数操作除了 sum 还有哪些?
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 存储 关系型数据库
|
7月前
|
关系型数据库 MySQL 数据库
MySQL数据库-截取字符串
MySQL数据库-截取字符串
73 0
|
4月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
245 67
|
3月前
|
关系型数据库 MySQL
mysql & clinkhouse之查询 行拼接
mysql & clinkhouse之查询 行拼接
mysql & clinkhouse之查询 行拼接
|
4月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第29天】MySQL的match匹配多个字符串的语法
152 2
|
7月前
|
关系型数据库 MySQL 数据库
MySql GROUP_CONCAT使用说明
MySql GROUP_CONCAT使用说明
|
3月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
219 0
|
4月前
|
存储 关系型数据库 MySQL
|
4月前
|
前端开发 关系型数据库 MySQL
mysql截断字符串
在MySQL中,有多种方法可以实现字符串的截断,每种方法都有其特定的应用场景。通过灵活使用这些字符串处理函数,可以高效地对数据进行处理和分析。在实际的数据库操作中,根据实际需求选择最合适的函数是关键。
153 0
|
5月前
|
关系型数据库 MySQL
mysql使用 CONCAT(字段,字段) 函数拼接
mysql使用 CONCAT(字段,字段) 函数拼接