浅析MySQL中concat以及group_concat的使用

本文详细介绍了MySQL中的concat和group_concat函数的使用。concat用于将多个字符串合并为一个,concat_ws则允许指定分隔符。group_concat在groupby查询中尤其有用,能将同一组的值连接成字符串,支持去除重复值和自定义排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

吃水不忘挖井人系列

原帖地址:
浅析MySQL中concat以及group_concat的使用


说明:

本文中使用的例子均在下面的数据库表tt2下执行:

在这里插入图片描述

一、concat()函数
1、功能:将多个字符串连接成一个字符串。

2、语法:concat(str1, str2,…)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

3、举例:

例1:select concat (id, name, score) as info from tt2;
在这里插入图片描述

中间有一行为null是因为tt2表中有一行的score值为null。

例2:在例1的结果中三个字段id,name,score的组合没有分隔符,我们可以加一个逗号作为分隔符:
在这里插入图片描述

这样看上去似乎顺眼了许多~~

但是输入sql语句麻烦了许多,三个字段需要输入两次逗号,如果10个字段,要输入九次逗号…麻烦死了啦,有没有什么简便方法呢?——于是可以指定参数之间的分隔符的concat_ws()来了!!!

二、concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

2、语法:concat_ws(separator, str1, str2, …)

说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

3、举例:

例3:我们使用concat_ws()将 分隔符指定为逗号,达到与例2相同的效果:
在这里插入图片描述

例4:把分隔符指定为null,结果全部变成了null:
在这里插入图片描述

三、group_concat()函数
前言:在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。(有关group by的知识请戳:浅析SQL中Group By的使用)。

例5:
在这里插入图片描述

该例查询了name相同的的人中最小的id。如果我们要查询name相同的人的所有的id呢?

当然我们可以这样查询:

例6:
在这里插入图片描述

但是这样同一个名字出现多次,看上去非常不直观。有没有更直观的方法,既让每个名字都只出现一次,又能够显示所有的名字相同的人的id呢?——使用group_concat()

1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

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

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

3、举例:

例7:使用group_concat()和group by显示相同名字的人的id号:
在这里插入图片描述

例8:将上面的id号从大到小排序,且用’_'作为分隔符:
在这里插入图片描述

例9:上面的查询中显示了以name分组的每组中所有的id。接下来我们要查询以name分组的所有组的id和score:
在这里插入图片描述

MySQL中的 `CONCAT` 和 `GROUP_CONCAT` 是两个常用的字符串处理函数,它们分别用于不同的场景,并且在功能和使用方式上有显著区别。 ### 1. `CONCAT` 函数 `CONCAT` 用于将多个字符串连接成一个单一的字符串。如果任意一个参数为 `NULL`,则整个结果也会是 `NULL`。该函数通常用于单条记录的字段拼接操作。 例如,可以将公司的名称和部门名称组合在一起显示: ```sql SELECT CONCAT(c.company_name, '-', d.dept_name) AS company_dept_name FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id; ``` 此查询会返回每一条记录中公司名与部门名通过短横线 `-` 拼接后的结果[^1]。 ### 2. `GROUP_CONCAT` 函数 `GROUP_CONCAT` 是一种聚合函数,主要用于在包含 `GROUP BY` 的查询中,将分组内的多行数据拼接成一个单独的字符串,默认使用逗号 `,` 作为分隔符。可以通过 `SEPARATOR` 关键字指定自定义的分隔符[^3]。 例如,当需要将每个公司的所有部门名称合并成一个字段时,可以使用如下查询: ```sql SELECT c.company_id, GROUP_CONCAT(DISTINCT d.dept_name SEPARATOR ',') AS dept_names FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id GROUP BY c.company_id; ``` 此查询的结果中,每个 `company_id` 对应的所有 `dept_name` 会被拼接成一个由逗号分隔的字符串[^1]。 ### 3. 主要区别 - **用途不同**: `CONCAT` 用于拼接同一行中的多个字段值;而 `GROUP_CONCAT` 用于将多行数据的某一字段值进行拼接。 - **是否属于聚合函数**: `GROUP_CONCAT` 是聚合函数,通常与 `GROUP BY` 配合使用;而 `CONCAT` 不是聚合函数,适用于每一行的字段拼接。 - **处理 NULL 值的方式**: 如果 `CONCAT` 中的任一参数为 `NULL`,则整个结果也为 `NULL`;而 `GROUP_CONCAT` 会忽略 `NULL` 值,不会将其纳入拼接结果中。 - **分组影响**: `GROUP_CONCAT` 必须配合 `GROUP BY` 使用,否则可能无法达到预期效果;而 `CONCAT` 不受分组影响,仅作用于当前行的数据。 ### 示例对比 假设表结构如下: #### 表 `sys_company`: | company_id | company_name | |------------|--------------| | 1 | Company A | | 2 | Company B | #### 表 `sys_dept`: | dept_id | dept_name | company_id | |---------|------------|------------| | 1 | HR | 1 | | 2 | Finance | 1 | | 3 | IT | 2 | #### 使用 `CONCAT` 查询: ```sql SELECT CONCAT(c.company_name, '-', d.dept_name) AS company_dept_name FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id; ``` **输出示例:** | company_dept_name | |---------------------| | Company A-HR | | Company A-Finance | | Company B-IT | #### 使用 `GROUP_CONCAT` 查询: ```sql SELECT c.company_id, GROUP_CONCAT(d.dept_name SEPARATOR ',') AS dept_names FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id GROUP BY c.company_id; ``` **输出示例:** | company_id | dept_names | |------------|--------------------| | 1 | HR,Finance | | 2 | IT | ### 注意事项 - `GROUP_CONCAT` 的结果长度受系统变量 `group_concat_max_len` 限制,默认值为 1024 字节。如需支持更长的字符串,可调整该值: ```sql SET SESSION group_concat_max_len = 1000000; ``` - 在使用 `GROUP_CONCAT` 时,建议加上 `DISTINCT` 来避免重复值被拼接进去,提高结果准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值