MySQL GROUP_CONCAT函数介绍
MySQL GROUP_CONCAT()
函数将组中的字符串连接成为具有各种选项的单个字符串。
下面说明了GROUP_CONCAT()
函数的语法:
GROUP_CONCAT(DISTINCT expression
ORDER BY expression
SEPARATOR sep)
以下是演示GROUP_CONCAT()
函数如何工作的一个示例。
USE testdb;
CREATE TABLE t ( v CHAR );
INSERT INTO t(v) VALUES('A'),('B'),('C'),('B');
SELECT
GROUP_CONCAT(DISTINCT v
ORDER BY v ASC
SEPARATOR ';')
FROM
t;
-- SELECT v FROM t GROUP BY v;
执行上面查询语句,得到以下结果 -
+---------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT v
ORDER BY v ASC
SEPARATOR ';') |
+---------------------------------------------------------------------+
| A;B;C |
+---------------------------------------------------------------------+
1 row in set
注:上面语句类似于把SELECT v FROM t GROUP BY v;
语句的结果串接起来。
DISTINCT子句用于在连接分组之前消除组中的重复值。
ORDER BY子句允许您在连接之前按升序或降序排序值。 默认情况下,它按升序排序值。 如果要按降序对值进行排序,则需要明确指定DESC
选项。
SEPARATOR
指定在组中的值之间插入的文字值。如果不指定分隔符,则GROUP_CONCAT
函数使用逗号(,
)作为默认分隔符。
GROUP_CONCAT
函数忽略NULL
值,如果找不到匹配的行,或者所有参数都为NULL
值,则返回NULL
。
GROUP_CONCAT
函数返回二进制或非二进制字符串,这取决于参数。 默认情况下,返回字符串的最大长度为1024
。如果您需要更多的长度,可以通过在SESSION
或GLOBAL
级别设置group_concat_max_len
系统变量来扩展最大长度。
具有CONCAT_WS函数的MySQL GROUP_CONCAT函数
有时,GROUP_CONCAT
函数可以与CONCAT_WS函数相结合,使查询结果更有用。
例如,制作客户分号分隔值列表:
- 首先,使用
CONCAT_WS
函数连接每个客户联系人的姓氏和名字,结果是联系人的全名。 - 然后,使用
GROUP_CONCAT
函数来创建列表。
以下查询使客户的分号分隔值列表。
SELECT
GROUP_CONCAT(CONCAT_WS(', ', contactLastName, contactFirstName) SEPARATOR ';')
FROM
customers;
请注意,GROUP_CONCAT
函数将字符串值连接在不同的行中,而CONCAT_WS
或CONCAT函数将不同列中的两个或多个字符串值连接起来。
MySQL GROUP_CONCAT函数(常见错误)
GROUP_CONCAT
函数返回单个字符串,而不是值列表。 这意味着您不能在IN
操作符中使用GROUP_CONCAT
函数的结果,例如在子查询中使用。
例如,GROUP_CONCAT
函数返回值的结果:1
, 2
和3
连接成为字符串:1,2,3
。
如果将此结果提供给IN
运算符,则查询不能正常工作。因此,查询可能不返回任何结果。例如,以下查询将无法正常工作。
因为IN运算符接受诸如(1,2,3)
的值的列表,而不是由值列表('1,2,3')
组成的字符串。 因此,以下查询将无法正常工作。
SELECT
id, name
FROM t
able_name
WHERE
id IN GROUP_CONCAT(id);
因为GROUP_CONCAT
函数是一个聚合函数,要对值进行排序,必须在函数内使用ORDER BY
子句,而不是SELECT语句中的ORDER BY
。
以下示例演示了在使用GROUP_CONCAT
函数的上下文中ORDER BY
子句的不正确使用:
SELECT
GROUP_CONCAT(DISTINCT country
SEPARATOR ';')
FROM
customers
ORDER BY country;
SELECT
子句返回一个字符串值,因此ORDER BY
子句在此语句中不起作用。
正确使用:
SELECT
GROUP_CONCAT(DISTINCT country order by country
SEPARATOR ';' )
FROM
customers
ORDER BY country;