MySQL中函数CONCAT及GROUP_CONCAT

本文深入浅出地介绍了SQL中的Group Concat函数,通过实例演示如何使用此函数进行分组操作,并探讨了其配置选项及应用场景。
group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。
比较抽象,难以理解。


通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函


数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。


group_concat函数应该是在内部执行了group by语句,这是我的猜测。


1.测试语句:SELECT group_concat(town) FROM `players` group by town


结果去查找town中去查找哪些值是一样的,如果相等,就全部列出来,以逗号分割进行列出,如下:


group_concat(town)
 
北京,北京
长沙




2.测试:SELECT group_concat( town )
FROM players
结果:
group_concat(town)
长沙,北京,北京,


上面是否可以证明,group_concat只有与group by语句同时使用才能产生效果? 下面进行了实际测验




3.测试常量对group_concat()的配置影响:
SET @@GROUP_CONCAT_MAX_LEN=4
手册中提到设置的语法是这样的:
SET [SESSION | GLOBAL] group_concat_max_len = val;


两种有什么区别?


SET @@global.GROUP_CONCAT_MAX_LEN=4;
global可以省略,那么就变成了:SET @@GROUP_CONCAT_MAX_LEN=4;




4.使用语句 SELECT group_concat(town) FROM `players`。结果得到:
group_concat(town)
长沙,北京,长沙,北京
结论:group_concat()函数需要与group by语句在一起使用,才能得到需要的效果。
原因可以这样理解:group_concat()得到是属于x组的所有成员(函数里面列参数指定需要显示哪些字段)。x组从哪里来?如


果没有group by进行指定,那么根本不知道group_concat()根据哪个分组进行显示出成员。 所以,像上面没有group by子句


的时候,就显示了长沙和北京。




实际中什么时候需要用到这个函数?
假如需要查询的结果是这样:左边显示组名,右边想显示该组别下的所有成员信息。用这个函数,就可以省去很多事情了。


另外,假如我这样使用:SELECT group_concat( name, sex ) FROM `players` town。意义不大。group_concat()指定一个


列是最好的情况。如果指定了多个列。那么显示结果类似这样:


group_concat(name,sex)
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、付费专栏及课程。

余额充值