文章目录
一、概述
GROUP_CONCAT
是一个用于将分组中的多个值连接成一个字符串的聚合函数。它在数据汇总、报告生成以及各种需要将多行数据合并为单行显示的场景中非常实用。通过 GROUP_CONCAT
,可以将同一组内的多个值合并为一个由指定分隔符分隔的字符串,简化数据展示和分析。
1、GROUP_CONCAT 函数的基本语法
GROUP_CONCAT
函数用于在分组查询中,将组内的多个值连接成一个字符串。它可以与 ORDER BY
和 SEPARATOR
子句一起使用,以控制连接结果的排序和分隔符。
GROUP_CONCAT([DISTINCT] expression [ORDER BY expression ASC|DESC] [SEPARATOR 'separator'])
DISTINCT(可选):去除重复值,只连接唯一的值。
expression:要连接的列或表达式。
ORDER BY(可选):指定连接前的排序方式。
SEPARATOR(可选):指定值之间的分隔符,默认为逗号(,)。
-- 示例
SELECT GROUP_CONCAT(name) AS names FROM users;
-- 结果
names
John,Doe,Jane
二、使用
1、数据汇总
在生成汇总报告时,GROUP_CONCAT
可以将分组内的多个记录合并为一个字符串,方便展示。例如,列出每个部门的所有员工姓名。
SELECT department, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY department;
此查询将返回每个部门及其对应的所有员工姓名,员工姓名之间以逗号分隔。
2、字符串连接
当需要将多行数据转换为单行字符串时,GROUP_CONCAT
是一个理想的选择。例如,将一个订单中所有商品的名称连接成一个字符串,便于显示或进一步处理。
SELECT order_id, GROUP_CONCAT(product_name SEPARATOR '; ') AS products
FROM order_details
GROUP BY order_id;
此查询将返回每个订单的 order_id
及其包含的所有商品名称,商品名称之间以分号和空格分隔。
3、 动态查询
在某些动态查询生成的场景中,GROUP_CONCAT
可以用于构建动态的SQL语句。例如,根据不同的条件动态生成 WHERE 子句。
SELECT GROUP_CONCAT(DISTINCT CONCAT('\'', category, '\'')) AS categories
FROM products;
此查询将返回所有不同的产品类别,并将其格式化为以单引号包裹的字符串,适用于动态生成 IN 子句。
4、添加order by和分隔符
mysql> select department,group_concat(distinct emp_name order by salary desc separator '@')
from emp group by department;
+------------+--------------------------------------------------------------------+
| department | group_concat(distinct emp_name order by salary desc separator '@') |
+------------+--------------------------------------------------------------------+
| 人事部 | 王大鹏@刘小贝@张小斐 |
| 财务部 | 赵刚@王飞飞@张晶晶 |
| 销售部 | 刘云云@刘云鹏 |
+------------+--------------------------------------------------------------------+
3 rows in set (0.00 sec)
三、注意
1、最大长度
最大长度限制:GROUP_CONCAT
的结果长度受限于系统变量 group_concat_max_len
。默认值可能较小,如果需要连接大量数据,应适当调整该变量。
SET SESSION group_concat_max_len = 1000000;
2、处理NULL值
GROUP_CONCAT 会忽略
组内的 NULL 值,不会将其包含在连接结果中。
3、分隔符选择
默认情况下,GROUP_CONCAT 使用逗号
作为分隔符。可以通过 SEPARATOR 子句自定义分隔符,以满足不同的需求。
SELECT GROUP_CONCAT(name SEPARATOR ' | ') AS names FROM users;
-- 结果
names
John | Doe | Jane
参考资料
https://cloud.tencent.com/developer/article/2093742
https://www.cnblogs.com/gbase/articles/18430756