MySQL 中的 GROUP_CONCAT() 函数是一个 聚合函数,它能够将多行数据组合成 一个字符串。这对于生成汇总报告特别有用,例如将相关的信息整合到一个字段中,以提高可读性或便于生成报表。
在本文中,我们将深入探索 GROUP_CONCAT() 函数。我们将从它的语法和参数开始,以了解其结构和用法。随后,我们将提供具体的示例,演示如何结合 DISTINCT、ORDER BY 和 SEPARATOR 等关键子句来使用该函数,从而展示其强大的灵活性。
在 MySQL 中,GROUP_CONCAT() 函数用于将多行数据连接成一个字段。这是一个聚合(GROUP BY)函数,如果分组中包含至少一个非 NULL 值,它将返回一个 字符串 值;否则,它返回 NULL。
语法:
SELECT col1, col2, ..., colN
GROUP_CONCAT ( [DISTINCT] col_name1
[ORDER BY clause] [SEPARATOR str_val] )
FROM table_name GROUP BY col_name2;
参数:
- col1, col2, …colN: 这些是表中的列名。
- col_name1: 表中的列名,该列的值将被连接到每个组的一个字段中。
- table_name: 表的名称。
- col_name2: 表中的列名,用于指定分组的依据。
在 GROUP_CONCAT() 函数中使用各种子句
- Distinct(去重): 它用于消除结果中重复的值。
- Order By(排序): 它首先按照特定顺序对组内的值进行排序,然后再将它们连接起来。
- Separator(分隔符): 默认情况下,组内的值通过(, )运算符分隔。为了更改这个分隔符,可以使用 SEPARATOR 子句,后跟一个字符串字面量。语法为 Separator ‘str_value‘。
MySQL GROUP_CONCAT() 函数示例
让我们假设有一个 "Employee"(员工)表:
fname
deptid
—
—
mukesh
2
neelam
3
mukesh
2
devesh
2
neelam
3
mukesh
2
keshav
3
devesh
2
tanya
1
keshav
3
tanya
1
示例 1:基本的 GROUP_CONCAT() 用法
按员工姓名(fname)分组,并连接他们的特长。
查询语句:
SELECT emp_id, fname, lname, dept_id,
GROUP_CONCAT ( strength ) as "strengths"
FROM employee
GROUP BY fname;
输出结果:
fname
deptid
—
—
mukesh
2
devesh
2
neelam
3
keshav
3
tanya
1
示例 2:使用 DISTINCT 子句
查询语句:
SELECT dept_id,
GROUP_CONCAT ( DISTINCT strength) as "employees strengths"
FROM employee
GROUP BY dept_id;
输出结果:
employees strengths
—
Goal-oriented, Hard-working
Leadership, Punctuality, Quick-learner, Responsible
Critical thinking, Hard-working, Listening, Self-motivated### 示例 3:使用 ORDER BY 子句
查询语句:
SELECT dept_id,
GROUP_CONCAT ( DISTINCT emp_id ORDER BY emp_id SEPARATOR ‘, ‘) as "employees ids"
FROM employee
GROUP BY dept_id;
在这里,Separator ‘, ‘ 将使用逗号(, )和一个空白字符来分隔值。
输出结果:
employees ids
—
5
1, 2
3, 4## 如何在一个字段中连接不同列的多行数据?
到目前为止,我们看到的都是 GROUPCONCAT() 函数用于将属于同一列的多行值进行分组。但是,通过结合使用 concat() 函数和 groupconcat() 函数,我们可以将不同行的多列值组合到一个字段中。
示例:
基于上述 "employee" 表,如果我们希望在查询结果中同时包含员工 ID 和特长,我们可以这样写:
SELECT dept_id, GROUP_CONCAT ( strengths SEPARATOR ‘ ‘) as "emp-id : strengths"
FROM (
SELECT dept_id, CONCAT ( emp_id, ‘:‘, GROUP_CONCAT(strength SEPARATOR‘, ‘) )
as "strengths"
FROM employee
GROUP BY emp_id
) as emp
GROUP BY dept_id;
解释:
上述查询由两个 [SELECT 语句](https://www.geeksforgeeks.org/sql/sql- 组成(注:原文此处截断,意为嵌套查询)。内部查询首先按 INLINECODE34562969 分组并使用 INLINECODE454878b2 和 INLINECODEb950a65a 组合 ID 与特长,外部查询再按 INLINECODE4536b234 分组,将所有员工的信息聚合到一起。