MySQL | GROUP_CONCAT() 函数详解

MySQL 中的 GROUP_CONCAT() 函数是一个 聚合函数,它能够将多行数据组合成 一个字符串。这对于生成汇总报告特别有用,例如将相关的信息整合到一个字段中,以提高可读性或便于生成报表。

在本文中,我们将深入探索 GROUP_CONCAT() 函数。我们将从它的语法和参数开始,以了解其结构和用法。随后,我们将提供具体的示例,演示如何结合 DISTINCTORDER 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"(员工)表:

empid

fname

lname

deptid

strength —

— 1

mukesh

gupta

2

Leadership 3

neelam

sharma

3

Hard-working 1

mukesh

gupta

2

Responsible 2

devesh

tyagi

2

Punctuality 3

neelam

sharma

3

Self-motivated 1

mukesh

gupta

2

Quick-learner 4

keshav

singhal

3

Listening 2

devesh

tyagi

2

Quick-learner 5

tanya

jain

1

Hard-working 4

keshav

singhal

3

Critical thinking 5

tanya

jain

1

Goal-oriented

示例 1:基本的 GROUP_CONCAT() 用法

按员工姓名(fname)分组,并连接他们的特长。

查询语句:

SELECT emp_id, fname, lname, dept_id, 
GROUP_CONCAT ( strength ) as "strengths" 
FROM employee 
GROUP BY fname;

输出结果:

empid

fname

lname

deptid

strengths —

— 1

mukesh

gupta

2

Leadership, Responsible, Quick-learner 2

devesh

tyagi

2

Punctuality, Quick-learner 3

neelam

sharma

3

Hard-working, Self-motivated 4

keshav

singhal

3

Listening, Critical thinking 5

tanya

jain

1

Hard-working, Goal-oriented

示例 2:使用 DISTINCT 子句

查询语句:

SELECT dept_id, 
GROUP_CONCAT ( DISTINCT strength)  as "employees strengths"  
FROM employee 
GROUP BY dept_id;

输出结果:

dept_id

employees strengths

1

Goal-oriented, Hard-working

2

Leadership, Punctuality, Quick-learner, Responsible

3

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 ‘, ‘ 将使用逗号(, )和一个空白字符来分隔值。

输出结果:

dept_id

employees ids

1

5

2

1, 2

3

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 分组,将所有员工的信息聚合到一起。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/25288.html
点赞
0.00 平均评分 (0% 分数) - 0