最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中GROUP_CONCAT函數(shù)用法和核心細(xì)節(jié)(按日期分組拼接銷售產(chǎn)品經(jīng)典案例)

 更新時(shí)間:2026年01月21日 09:58:09   作者:lcj fighting  
本文詳細(xì)介紹了MySQL的GROUP_CONCAT()函數(shù)的用法和核心細(xì)節(jié),包括函數(shù)定義、語法格式、常用修飾符(DISTINCT、ORDERBY、SEPARATOR)以及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧

前言

在日常的SQL業(yè)務(wù)開發(fā)中,我們經(jīng)常遇到分組統(tǒng)計(jì)+分組內(nèi)字段拼接的需求,比如按日期統(tǒng)計(jì)每日銷售的產(chǎn)品數(shù)量、并將當(dāng)日銷售的所有產(chǎn)品名稱拼接成一個(gè)字符串展示。這類需求用普通的GROUP BY分組+聚合函數(shù)是無法實(shí)現(xiàn)的,而MySQL的GROUP_CONCAT()函數(shù)就是專門解決這類場景的「神器」,今天結(jié)合經(jīng)典的「按日期分組統(tǒng)計(jì)銷售產(chǎn)品」SQL案例,徹底吃透GROUP_CONCAT()的用法和核心細(xì)節(jié)。

一、先看完整業(yè)務(wù)場景SQL(經(jīng)典面試/業(yè)務(wù)題)

需求說明

現(xiàn)有銷售記錄表Activities,表中核心字段為sell_date(銷售日期)、product(銷售產(chǎn)品名),要求:

  1. 按銷售日期進(jìn)行分組
  2. 統(tǒng)計(jì)每日不同產(chǎn)品的銷售數(shù)量
  3. 展示每日銷售的所有不同產(chǎn)品名稱,產(chǎn)品名稱按字母升序排列、用英文逗號(hào)分隔
  4. 最終結(jié)果按銷售日期升序排序

實(shí)現(xiàn)SQL

select
    sell_date,
    count(distinct product) as num_sold, -- 統(tǒng)計(jì)每日售賣的不同產(chǎn)品數(shù)
    group_concat(distinct product order by product separator ',') as products -- 拼接每日售賣的產(chǎn)品名
from
    Activities
group by
    sell_date -- 核心:按日期分組
order by
    sell_date ASC;

二、GROUP_CONCAT() 函數(shù)核心介紹

? 函數(shù)定義

GROUP_CONCAT() 是MySQL專屬的分組聚合函數(shù),作用是:將分組后的同一組內(nèi)的指定字段的所有值,拼接成一個(gè)完整的字符串返回

? 函數(shù)核心語法格式

GROUP_CONCAT([DISTINCT] 字段名 [ORDER BY 字段排序規(guī)則] [SEPARATOR '分隔符'])

? 語法各部分解析(重中之重,全部常用)

1. 必選核心:GROUP_CONCAT(字段名)

最基礎(chǔ)用法,無任何修飾,直接拼接分組內(nèi)指定字段的所有值。

  • 特點(diǎn):會(huì)保留字段的重復(fù)值
  • 拼接分隔符:默認(rèn)使用 英文逗號(hào), 分隔
  • 排序:默認(rèn)按字段值的自然順序排序,無指定規(guī)則

2. 核心修飾1:DISTINCT去重關(guān)鍵字

GROUP_CONCAT(DISTINCT 字段名)

這是業(yè)務(wù)中極高頻的用法,作用是:對(duì)分組內(nèi)要拼接的字段值先去重,再拼接

比如本文案例中,同一天可能同一個(gè)產(chǎn)品賣出多次,我們只需要展示「當(dāng)日賣了哪些產(chǎn)品」,而非「每次賣出的產(chǎn)品」,所以必須加DISTINCT product,避免產(chǎn)品名重復(fù)拼接。

3. 核心修飾2:ORDER BY排序子句

GROUP_CONCAT(字段名 ORDER BY 字段名 [ASC/DESC])

作用是:對(duì)分組內(nèi)要拼接的字段值,按照指定規(guī)則排序后再拼接。

比如本文案例中要求產(chǎn)品名按字母升序排列,所以寫order by product(默認(rèn)ASC升序,可省略),如果需要降序則寫order by product DESC

4. 核心修飾3:SEPARATOR '分隔符'分隔符指定

GROUP_CONCAT(字段名 SEPARATOR '自定義分隔符')

作用是:指定拼接后的分隔符,替換默認(rèn)的英文逗號(hào)

  • 支持任意自定義分隔符:逗號(hào),、豎線|、橫線-、空格 、分號(hào);

比如本文案例指定用英文逗號(hào)分隔,所以寫separator ',',這也是最常用的分隔符。

? 完整組合用法(案例同款,開發(fā)中最常用)

GROUP_CONCAT(DISTINCT 字段名 ORDER BY 字段名 SEPARATOR '分隔符')

先去重 → 再排序 → 最后按指定分隔符拼接,完美解決絕大多數(shù)分組拼接需求。

三、GROUP_CONCAT() 核心注意事項(xiàng)(避坑必備)

? 注意1:必須配合 GROUP BY 使用,否則無意義

GROUP_CONCAT()分組聚合函數(shù),和COUNT()、SUM()、MAX()等函數(shù)的特性一致:

  • 如果有GROUP BY,則按分組維度拼接每組的字段值
  • 如果沒有GROUP BY,則整張表視為「一個(gè)分組」,會(huì)把指定字段的所有值拼接成一個(gè)字符串

切記:該函數(shù)不能脫離分組場景單獨(dú)使用,否則業(yè)務(wù)邏輯一定錯(cuò)誤。

? 注意2:默認(rèn)有長度限制,超出會(huì)被截?cái)?/h3>

這是最容易踩坑的點(diǎn),MySQL對(duì)GROUP_CONCAT()的返回結(jié)果,默認(rèn)有最大長度限制 1024 字節(jié)。

  • 如果分組內(nèi)要拼接的內(nèi)容過多(比如一個(gè)分組有上百個(gè)產(chǎn)品名),拼接后的字符串長度超過1024字節(jié),超出部分會(huì)被直接截?cái)?/strong>,導(dǎo)致返回結(jié)果不完整。

? 解決方案:修改長度限制(兩種方式)

方式1:臨時(shí)修改(當(dāng)前會(huì)話有效,重啟MySQL失效)

-- 設(shè)置全局的拼接長度限制,建議設(shè)置為合適的值,比如102400(100KB)
SET GLOBAL group_concat_max_len = 102400;
-- 設(shè)置當(dāng)前會(huì)話的拼接長度限制
SET SESSION group_concat_max_len = 102400;

方式2:永久修改(修改配置文件,推薦生產(chǎn)環(huán)境使用)

編輯MySQL的配置文件my.cnf(Linux)或my.ini(Windows),在[mysqld]節(jié)點(diǎn)下添加配置:

[mysqld]
group_concat_max_len = 102400

添加后重啟MySQL服務(wù),配置永久生效。

? 注意3:與 CONCAT() 的區(qū)別,千萬不要混淆

很多初學(xué)者會(huì)把GROUP_CONCAT()CONCAT()搞混,這兩個(gè)函數(shù)完全不同,用途天差地別,這里做清晰區(qū)分,杜絕混淆:

  1. CONCAT(字段1,字段2,…)行級(jí)拼接,作用于「單行數(shù)據(jù)」,將同一行的多個(gè)字段值拼接成一個(gè)字符串,不分組、聚合相關(guān)
    • 例:CONCAT(name, '-', price) → 把單行的姓名和價(jià)格拼接成「張三-99」
  2. GROUP_CONCAT(字段)分組拼接,作用于「分組后的多行數(shù)據(jù)」,將同一分組的多行的同一個(gè)字段值拼接成一個(gè)字符串,必須分組、屬于聚合函數(shù)。
    • 例:本文案例中,把「2026-01-20」這個(gè)分組的所有產(chǎn)品名拼接成「蘋果,香蕉,橙子」

? 一句話總結(jié)區(qū)別:CONCAT是同行多字段拼接,GROUP_CONCAT是同組同字段多行拼接

四、拓展:常見衍生用法

? 用法1:拼接多個(gè)字段+自定義分隔符

如果需要在分組內(nèi),拼接「產(chǎn)品名+價(jià)格」這類多個(gè)字段的組合值,可以嵌套CONCAT()使用:

select
    sell_date,
    group_concat(DISTINCT CONCAT(product, '-', price) ORDER BY product separator ';') as product_price
from Activities
group by sell_date;

效果:拼接出「蘋果-5.9;香蕉-3.9;橙子-4.5」這樣的組合字符串。

? 用法2:結(jié)合其他聚合函數(shù)使用

COUNT(DISTINCT)、SUM()等聚合函數(shù)完美兼容,也是本文案例的寫法,這是業(yè)務(wù)開發(fā)中的標(biāo)配:

select
    sell_date,
    count(distinct product) as 銷售產(chǎn)品數(shù),
    sum(amount) as 當(dāng)日銷售額,
    group_concat(distinct product order by product) as 銷售產(chǎn)品列表
from Activities
group by sell_date;

五、總結(jié)

? 核心知識(shí)點(diǎn)

  1. GROUP_CONCAT()是MySQL分組聚合函數(shù),作用是分組拼接同組字段值為字符串;
  2. 完整語法:GROUP_CONCAT([DISTINCT] 字段 [ORDER BY 字段] [SEPARATOR '分隔符']);
  3. 三大核心修飾:DISTINCT去重、ORDER BY排序、SEPARATOR指定分隔符,可組合使用;
  4. 必須配合GROUP BY使用,否則無分組意義;
  5. 默認(rèn)長度限制1024字節(jié),超長需手動(dòng)修改配置;
  6. CONCAT()的核心區(qū)別:分組多行單字段拼接 vs 單行多字段拼接。

? 業(yè)務(wù)適用場景

除了本文的「按日期分組拼接銷售產(chǎn)品」,該函數(shù)還適用于所有需要分組聚合+內(nèi)容拼接的場景:

  • 按用戶分組,拼接用戶所有的下單商品;
  • 按班級(jí)分組,拼接班級(jí)所有的學(xué)生姓名;
  • 按部門分組,拼接部門所有的員工工號(hào);
  • 按訂單分組,拼接訂單所有的商品規(guī)格。

GROUP_CONCAT()是MySQL開發(fā)中非常實(shí)用的函數(shù),掌握其用法和避坑點(diǎn),能極大提升我們處理分組拼接類需求的效率,希望本文的講解能幫助大家徹底吃透這個(gè)函數(shù)!

到此這篇關(guān)于MySQL中GROUP_CONCAT函數(shù)用法和核心細(xì)節(jié)(按日期分組拼接銷售產(chǎn)品經(jīng)典案例)的文章就介紹到這了,更多相關(guān)MySQL中GROUP_CONCAT函數(shù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

岳阳县| 都江堰市| 斗六市| 剑河县| 桃源县| 霍林郭勒市| 玉山县| 资讯 | 麻阳| 边坝县| 德兴市| 普兰县| 冷水江市| 平远县| 合水县| 石嘴山市| 巴东县| 三穗县| 洞头县| 东乡县| 芮城县| 张掖市| 安顺市| 名山县| 江西省| 丁青县| 安达市| 芦山县| 师宗县| 南和县| 泰宁县| 布拖县| 延安市| 大宁县| 庆元县| 察雅县| 凭祥市| 洛隆县| 洛扎县| 邵东县| 千阳县|