MySQL拼接字符串函數(shù)GROUP_CONCAT詳解
上一篇文章 跨表更新,看到自己寫的SQL像個(gè)憨憨寫了關(guān)于跨表個(gè)更新的內(nèi)容。一年過(guò)的很快,文中后來(lái)的兩位員工 馮大
和 馮二
也要面對(duì)無(wú)情的 KPI 考核了,他們工作干的很不錯(cuò),performance 分別是 4 和 5
新需求來(lái)了,靜悄悄的來(lái)了?。?! 領(lǐng)導(dǎo)想要查看每個(gè) performance 下都有誰(shuí),同時(shí)要求將這些人的名稱要逗號(hào)拼接成一個(gè)字符串,也就是說(shuō)要得到下面的結(jié)果:
要將結(jié)果集中某個(gè)指定的列進(jìn)行字符串拼接,這要怎么做呢?主角閃亮✨登場(chǎng)
GROUP_CONCAT(expr)
在 Mysql 官方文檔 中,該函數(shù)被放在聚合函數(shù)章節(jié),如果你要按照指定字段分組拼接,就要配合關(guān)鍵字 GROUP BY
來(lái)使用的
定義
該函數(shù)返回一個(gè)字符串結(jié)果,該字符串結(jié)果是通過(guò)分組串聯(lián)的非NULL值
。如果沒(méi)有非NULL值,則返回NULL。完整語(yǔ)法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
What? 這個(gè)語(yǔ)法看著太復(fù)雜了吧,別著急,下面會(huì)用例子慢慢說(shuō)明逐一驗(yàn)證滴
使用案例
先完成文章開(kāi)頭的需求:
SELECT performance, GROUP_CONCAT(employee_name) AS employees FROM employees GROUP BY performance;
zou是這個(gè)結(jié)果:
到這里,領(lǐng)導(dǎo)給過(guò)來(lái)的需求就完成了😜
客官請(qǐng)留步,您點(diǎn)的菜還沒(méi)上完呢......
我們是國(guó)際化的團(tuán)隊(duì),我們的家鄉(xiāng)遍布五湖四海
領(lǐng)導(dǎo)想關(guān)懷一下員工,要查看公司全部員工的家鄉(xiāng)都有哪些地方。員工們可能來(lái)自同一個(gè)地方,所以要將結(jié)果集去重復(fù),DISTINCT
關(guān)鍵字就派上用場(chǎng)了
SELECT GROUP_CONCAT(DISTINCT home_town) FROM employees;
來(lái)看結(jié)果:
領(lǐng)導(dǎo)的關(guān)懷遍布五湖四海啊......
文案要改了,領(lǐng)導(dǎo)的關(guān)懷是遍布四海五湖
的, 那么 ORDER BY
關(guān)鍵字就派上用場(chǎng)了
SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '領(lǐng)導(dǎo)關(guān)懷地區(qū)' FROM employees; -- 沒(méi)我這么起變量的哈,還是漢語(yǔ),我看你是瘋了
這里你看到 GROUP_CONCAT
函數(shù)拼接字符串默認(rèn)的分隔符是逗號(hào) ,
, 領(lǐng)導(dǎo)不開(kāi)心,逗號(hào)么的感情,要用❕才能體現(xiàn)出關(guān)懷的強(qiáng)烈, SEPARATOR
關(guān)鍵字就派上用場(chǎng)了
分組拼接的值之間默認(rèn)分隔符是逗號(hào)(,)。要明確指定分隔符,需要使用SEPARATOR
關(guān)鍵字,緊跟其后的是你想設(shè)置的分隔符。要完全消除分隔符,就在SEPARATOR
關(guān)鍵字后面寫 '' 就好了
SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '領(lǐng)導(dǎo)關(guān)懷地區(qū)' FROM employees;
SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '領(lǐng)導(dǎo)關(guān)懷地區(qū)' FROM employees;
這關(guān)懷到位了吧,你品,你細(xì)品?。?!
領(lǐng)導(dǎo)的關(guān)懷能力也有限,拼接的字符串默認(rèn)的最大長(zhǎng)度是1024個(gè)字符,可以通過(guò)下面語(yǔ)句查看當(dāng)前限制是多少:
show variables like 'group_concat_max_len';
領(lǐng)導(dǎo)的能力可是飄忽不定的,所以我們可以靈活的設(shè)置這個(gè)值
SET [GLOBAL | SESSION] group_concat_max_len = val;
SESSION: 在當(dāng)前對(duì)話中生效 GLOBAL:全局都生效
該語(yǔ)句在執(zhí)行后,MySQL重啟之前一直有作用,一旦重啟 MySQL,則會(huì)恢復(fù)默認(rèn)值
有時(shí)候 GROUP_CONCAT()
還要搭配 CONCAT_WS()
發(fā)揮出一點(diǎn)點(diǎn)威力,舉個(gè)簡(jiǎn)單的例子
將消費(fèi)者的名和姓用逗號(hào)進(jìn)行分隔,然后再用 ;
進(jìn)行分隔
SELECT GROUP_CONCAT( CONCAT_WS(', ', contactLastName, contactFirstName) SEPARATOR ';') FROM customers;
這里是 CONCAT_WS()函數(shù)用法, 很簡(jiǎn)單,請(qǐng)自行查看吧......
注意⚠️
GROUP_CONCAT()函數(shù)返回單個(gè)字符串,而不是值列表。這意味著我們不能在 IN 運(yùn)算符中使用GROUP_CONCAT()函數(shù)的結(jié)果,例如,在子查詢中, 像這樣:
SELECT id, name FROM table_name WHERE id IN GROUP_CONCAT(id);
總結(jié)
在許多情況下,我們都可以應(yīng)用GROUP_CONCAT()函數(shù)產(chǎn)生出有用的結(jié)果,同時(shí)也可以結(jié)合其他函數(shù)發(fā)揮出更大的威力. 單招學(xué)會(huì)了,就要學(xué)會(huì)連招 combo 了
相關(guān)文章
navicat連接mysql時(shí)出現(xiàn)1045錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了navicat連接mysql時(shí)出現(xiàn)1045錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02mysql中count(), group by, order by使用詳解
mysql中order by 排序查詢、asc升序、desc降序,group by 分組查詢、having 只能用于group by子句、作用于組內(nèi),having條件子句可以直接跟函數(shù)表達(dá)式。使用group by 子句的查詢語(yǔ)句需要使用聚合函數(shù)。2017-05-05CentOS7.x卸載與安裝MySQL5.7的操作過(guò)程及編碼格式的修改方法
這篇文章主要介紹了CentOS7.x卸載與安裝MySQL5.7的操作過(guò)程及編碼格式的修改方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05面試提問(wèn)mysql一張表到底能存多少數(shù)據(jù)
這篇文章主要為大家介紹了面試提問(wèn)mysql一張表到底能存多少數(shù)據(jù)的問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03MySQL查詢數(shù)據(jù)庫(kù)中某個(gè)庫(kù)、表、索引等所占空間的大小
MySQL是一個(gè)非常流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它的查詢操作是非常強(qiáng)大和靈活的。查詢的效率不僅取決于表的大小,而且還取決于索引的大小,本文主要介紹了MySQL查詢數(shù)據(jù)庫(kù)中某個(gè)庫(kù)、表、索引等所占空間的大小,感興趣的可以了解一下2024-01-01MySql?InnoDB存儲(chǔ)引擎之Buffer?Pool運(yùn)行原理講解
緩沖池是用于存儲(chǔ)InnoDB表,索引和其他輔助緩沖區(qū)的緩存數(shù)據(jù)的內(nèi)存區(qū)域。緩沖池的大小對(duì)于系統(tǒng)性能很重要。更大的緩沖池可以減少磁盤I/O來(lái)多次訪問(wèn)同一表數(shù)據(jù)。在專用數(shù)據(jù)庫(kù)服務(wù)器上,可以將緩沖池大小設(shè)置為計(jì)算機(jī)物理內(nèi)存大小的百分之802023-01-01詳細(xì)介紹基于MySQL的搜索引擎MySQL-Fullltext
這篇文章主要詳細(xì)介紹基于MySQL的搜索引擎MySQL-Fullltext,需要用到C和C#以及JavaScript的知識(shí),屬于MySQL的高階應(yīng)用,需要的朋友可以參考下2015-04-04