group_concat用法详解

GROUP_CONCAT函数在SQL中用于在分组查询时合并列值,例如按分数分组并列出每个分数段的学生姓名。通过添加DISTINCT关键字,可以去除重复值。此外,可以自定义分隔符,如将默认的逗号改为百分号。

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

group_concat函数常用于select 语句中,下面我们通过一张表来讲解group_concat函数的用法。

首先来看下初始的select函数:

select * from exam;
上述sql执行结果为:

|id    |subject |student|teacher|score|
---------------------------------------
|1	   |数学    |小红	|王老师	|80   |
|2	   |数学    |小李	|王老师	|80   |
|3	   |数学    |小王	|王老师	|70   |
|4	   |数学    |小张	|王老师	|90   |
|5	   |数学    |小赵	|王老师	|70   |
|6	   |数学    |小孙	|王老师	|80   |
|7	   |数学    |小钱	|王老师	|90   |
|8	   |数学    |小高	|王老师	|70   |
|9	   |数学    |小秦	|王老师	|80   |
|10	   |数学    |小马	|王老师	|90   |
|11	   |数学    |小朱	|王老师	|90   |
|12	   |语文    |小高	|李老师	|70   |
|15	   |语文    |小秦	|李老师	|70   |
|18	   |语文    |小马	|李老师	|80   |
|21	   |语文    |小朱	|李老师	|90   |
|24	   |语文    |小钱	|李老师	|90   |
    如果我们希望按分数score进行分组,并将分组后的学生姓名打印下来,就可以用group_concat实现。执行sql:

select score,group_concat(student) from exam group by score;
执行结果为:

|score |group_concat(student)		|
-------------------------------------
|70	   |小王,小赵,小高,小高,小秦		|
|80	   |小红,小李,小孙,小秦,小马		|
|90	   |小张,小钱,小马,小朱,小朱,小钱	|
    不难看出,在70分这一行有两条小高的记录,90分这一行有两条小钱和小朱的记录,如果我们需要去重,则需要给函数中加一个distinct参数:

select score,group_concat(distinct student) from exam group by score;
执行结果为:

|score |group_concat(student)	|
---------------------------------
|70	   |小王,小赵,小高,小秦		|
|80	   |小红,小李,小孙,小秦,小马	|
|90	   |小张,小钱,小马,小朱		|
     这样group_concat每行数据的结果中就没有了重复值,但是在数据中的分隔符为默认的逗号',',如果想修改默认的分隔符,只需要在上述指令中稍作修改:

select score,group_concat(distinct student separator ‘%’) from exam group by score;
执行结果:

|score |group_concat(student)	|
---------------------------------
|70	   |小王%小秦%小赵%小高		|
|80	   |小孙%小李%小秦%小红%小马	|
|90	   |小张%小朱%小钱%小马		|
### 关于 `GROUP_CONCAT` 函数的详细解释 #### 定义与功能 `GROUP_CONCAT` 是 MySQL 中的一个聚合函数,用于将同一分组中的多个行值拼接成一个字符串[^1]。它常用于简化查询结果,尤其是在需要展示分组后的汇总信息时。 --- #### 语法结构 完整的语法定义如下: ```sql GROUP_CONCAT( [DISTINCT] expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC]] [SEPARATOR str_val] ) ``` - **`expr`**: 表达式或列名,表示要拼接的内容。 - **`DISTINCT`**: 可选参数,指定是否去除重复项后再进行拼接[^3]。 - **`ORDER BY`**: 对拼接前的数据按指定顺序排列,默认升序(`ASC`),也可以设置降序(`DESC`)[^2]。 - **`SEPARATOR`**: 自定义拼接字符,默认为逗号 `,`[^4]。 --- #### 实际应用示例 ##### 示例 1: 基本用法 假设有一张名为 `test_group_concat` 的表,其中存储了用户的 ID 和年龄数据。可以通过以下 SQL 查询实现对相同 ID 下的年龄值进行拼接: ```sql SELECT id, GROUP_CONCAT(age) AS ages FROM test_group_concat GROUP BY id; ``` 此查询会返回每组 ID 对应的所有年龄值,并以默认的逗号`,`作为分隔符[^1]。 ##### 示例 2: 添加自定义分隔符 如果希望使用其他符号代替默认的逗号,则可以显式声明 `SEPARATOR` 参数: ```sql SELECT id, GROUP_CONCAT(age SEPARATOR '|') AS ages FROM test_group_concat GROUP BY id; ``` 这里的结果将以竖线 `|` 分割各个年龄值[^3]。 ##### 示例 3: 数据去重 当存在重复记录而只需要唯一值时,可加入 `DISTINCT` 关键字来消除冗余条目: ```sql SELECT id, GROUP_CONCAT(DISTINCT age) AS unique_ages FROM test_group_concat GROUP BY id; ``` 这样能够确保最终得到的是不含有任何重复项目的列表[^1]。 ##### 示例 4: 结果排序 还可以通过附加 `ORDER BY` 子句控制输出序列的先后次序: ```sql SELECT id, GROUP_CONCAT(age ORDER BY age DESC) AS sorted_ages FROM test_group_concat GROUP BY id; ``` 这段代码按照年龄从大到小的方式重新安排各元素的位置再执行串联操作[^2]。 ##### 示例 5: 复杂表达式的组合 更进一步地说,在某些情况下可能还需要处理更加复杂的场景比如嵌套调用或者格式化输出等等。下面这个例子展示了如何先利用 `CONCAT()` 方法构建带引号的名字然后再传递给外部层面上的 `GROUP_CONCAT()` 进一步加工: ```sql SELECT GROUP_CONCAT(CONCAT('\'', name, '\'')) AS quoted_names, GROUP_CONCAT(CONCAT(name,'-',type)) AS combined_fields FROM field_data; ``` 在这里不仅实现了简单的字段连接还加入了额外的信息标记以便后续解析方便. --- ### 性能注意事项 尽管 `GROUP_CONCAT` 功能强大,但在大规模数据集上的表现可能会受到一定限制。主要体现在以下几个方面: - 返回的最大长度受系统变量 `group_concat_max_len` 控制,默认值通常较小(如1024)。可以根据需求调整该参数大小以适应更大规模的数据量[^4]。 修改方法如下所示: ```sql SET SESSION group_concat_max_len = 10000; -- 设置当前会话的有效范围内的最大允许长度至1万单位字符数. ``` 另外需要注意的是过度依赖此类高耗资源型的操作可能导致整体性能下降因此建议合理规划索引以及优化查询逻辑从而达到最佳平衡状态. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值