SQL—Group_Concat函数用法详解
在LC遇见的一道很有趣的SQL题,有用到这个函数,就借这道题抛砖引玉,在此讲解一下group_concat
函数的用法。🤣
GROUP_CONCAT([DISTINCT] expression [ORDER BY expression] [SEPARATOR separator])
-
DISTINCT
(可选):去除重复的值。指定DISTINCT
,GROUP_CONCAT
会在连接值之前去除重复的行。 -
expression
:需要合并的字段或表达式。可以是表中的列,也可以是计算结果。 -
ORDER BY expression
(可选):定义合并顺序。可以对结果进行排序(例如按字母顺序排序)。 -
SEPARATOR separator
(可选):指定连接值之间的分隔符,默认为逗号(,
)。可以自定义为其他字符或字符串(如空格、分号、破折号等)。
Demo01🍬🍬🍬:基本用法
将同一个 state
下的 city
合并为一个以逗号分隔的字符串。
state | city |
---|---|
California | Los Angeles |
California | San Francisco |
California | San Diego |
Texas | Houston |
Texas | Austin |
Texas | Dallas |
Demo02🍬🍬🍬:去重使用(DISTINCT)
避免重复的城市名称,可以使用 DISTINCT
。
state | city |
---|---|
California | Los Angeles |
California | Los Angeles |
Texas | Houston |
Texas | Austin |
Texas | Dallas |
SELECT
state,
GROUP_CONCAT(DISTINCT city ORDER BY city ASC SEPARATOR ', ') AS cities
FROM
cities
GROUP BY
state;
state | cities |
---|---|
California | Los Angeles |
Texas | Austin, Dallas, Houston |
Demo03🍬🍬🍬:自定义分隔符
SEPARATOR
参数自定义分隔符。
将城市之间用分号(;
)连接:
state | cities |
---|---|
California | Los Angeles; San Diego; San Francisco |
Texas | Austin; Dallas; Houston |
Demo04🍬🍬🍬:按其他字段排序
使用 ORDER BY
对结果进行排序。按城市名称的字母降序排列:
state | cities |
---|---|
California | San Francisco, San Diego, Los Angeles |
Texas | Houston, Dallas, Austin |
Demo05🍬🍬🍬:合并计算结果
GROUP_CONCAT
不仅可以用来合并字段,还可以合并计算结果。例如,连接多个字段或计算的结果:
state | city | population |
---|---|---|
California | Los Angeles | 1000000 |
California | San Francisco | 900000 |
Texas | Houston | 2000000 |
Texas | Austin | 900000 |
SELECT
state,
GROUP_CONCAT(CONCAT(city, ' (', population, ')') ORDER BY city ASC SEPARATOR ', ') AS cities
FROM
cities
GROUP BY
state;
state | cities |
---|---|
California | Los Angeles (1000000), San Francisco (900000) |
Texas | Austin (900000), Houston (2000000) |
Demo06🍬🍬🍬:最大长度限制
默认情况下,GROUP_CONCAT
的结果字符串有最大长度限制。
查询当前最大长度:
SHOW VARIABLES LIKE 'group_concat_max_len';
修改最大长度(例如,设置为 10000 字节):
SET SESSION group_concat_max_len = 10000;
最后来一道难度大一丢丢的(综合性比较强)SQL题: