MySQL拼接字串,GROUP_CONCAT 值得擁有

日拱一兵發表於2020-02-04

上一篇文章 跨表更新,看到自己寫的SQL像個憨憨 寫了關於跨表個更新的內容。一年過的很快,文中後來的兩位員工 馮大馮二 也要面對無情的 KPI 考核了,他們工作乾的很不錯,performance 分別是 4 和 5

MySQL拼接字串,GROUP_CONCAT 值得擁有

新需求來了,靜悄悄的來了!!! 領導想要檢視每個 performance 下都有誰,同時要求將這些人的名稱要逗號拼接成一個字串,也就是說要得到下面的結果:

MySQL拼接字串,GROUP_CONCAT 值得擁有

要將結果集中某個指定的列進行字串拼接,這要怎麼做呢?主角閃亮✨登場

GROUP_CONCAT(expr)

Mysql 官方文件 中,該函式被放在聚合函式章節,如果你要按照指定欄位分組拼接,就要配合關鍵字 GROUP BY 來使用的

MySQL拼接字串,GROUP_CONCAT 值得擁有

定義

該函式返回一個字串結果,該字串結果是通過分組串聯的非NULL值。如果沒有非NULL值,則返回NULL。完整語法如下:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])
複製程式碼

What? 這個語法看著太複雜了吧,彆著急,下面會用例子慢慢說明逐一驗證滴

使用案例

先完成文章開頭的需求:

SELECT performance, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY performance;
複製程式碼

zou是這個結果:

MySQL拼接字串,GROUP_CONCAT 值得擁有

到這裡,領導給過來的需求就完成了?

客官請留步,您點的菜還沒上完呢......

我們是國際化的團隊,我們的家鄉遍佈五湖四海

MySQL拼接字串,GROUP_CONCAT 值得擁有

領導想關懷一下員工,要檢視公司全部員工的家鄉都有哪些地方。員工們可能來自同一個地方,所以要將結果集去重複,DISTINCT 關鍵字就派上用場了

SELECT GROUP_CONCAT(DISTINCT home_town)
FROM employees;
複製程式碼

來看結果:

MySQL拼接字串,GROUP_CONCAT 值得擁有

領導的關懷遍佈五湖四海啊......

文案要改了,領導的關懷是遍佈四海五湖的, 那麼 ORDER BY 關鍵字就派上用場了

SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '領導關懷地區'
FROM employees;

-- 沒我這麼起變數的哈,還是漢語,我看你是瘋了
複製程式碼

MySQL拼接字串,GROUP_CONCAT 值得擁有

這裡你看到 GROUP_CONCAT 函式拼接字串預設的分隔符是逗號 ,, 領導不開心,逗號麼的感情,要用❕才能體現出關懷的強烈, SEPARATOR 關鍵字就派上用場了

分組拼接的值之間預設分隔符是逗號(,)。要明確指定分隔符,需要使用 SEPARATOR 關鍵字,緊跟其後的是你想設定的分隔符。要完全消除分隔符,就在 SEPARATOR 關鍵字後面寫 '' 就好了

SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '領導關懷地區'
FROM employees;
複製程式碼

MySQL拼接字串,GROUP_CONCAT 值得擁有

SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '領導關懷地區'
FROM employees;
複製程式碼

MySQL拼接字串,GROUP_CONCAT 值得擁有

這關懷到位了吧,你品,你細品!!!

領導的關懷能力也有限,拼接的字串預設的最大長度是1024個字元,可以通過下面語句檢視當前限制是多少:

show variables like 'group_concat_max_len';
複製程式碼

MySQL拼接字串,GROUP_CONCAT 值得擁有

領導的能力可是飄忽不定的,所以我們可以靈活的設定這個值

SET [GLOBAL | SESSION] group_concat_max_len = val;
複製程式碼
  • SESSION: 在當前對話中生效
  • GLOBAL:全域性都生效

該語句在執行後,MySQL重啟之前一直有作用,一旦重啟 MySQL,則會恢復預設值

有時候 GROUP_CONCAT() 還要搭配 CONCAT_WS() 發揮出一點點威力,舉個簡單的例子

將消費者的名和姓用逗號進行分隔,然後再用 ; 進行分隔

SELECT
    GROUP_CONCAT(
       CONCAT_WS(', ', contactLastName, contactFirstName)
       SEPARATOR ';')
FROM
    customers;
複製程式碼

這裡是 CONCAT_WS()函式用法, 很簡單,請自行檢視吧......

注意⚠️

GROUP_CONCAT()函式返回單個字串,而不是值列表。這意味著我們不能在 IN 運算子中使用GROUP_CONCAT()函式的結果,例如,在子查詢中, 像這樣:

SELECT
    id, name
FROM
    table_name
WHERE
    id IN GROUP_CONCAT(id);
複製程式碼

總結

在許多情況下,我們都可以應用GROUP_CONCAT()函式產生出有用的結果,同時也可以結合其他函式發揮出更大的威力. 單招學會了,就要學會連招 combo 了

  • 如果你也像我一樣剛知道這個知識點,還請點個「在看」
  • 如果你早都知道這個小兒科內容,還請留言送上「噓聲」

靈魂追問

  1. 聚合函式和 group by 搭配有哪些限制?

  2. 你能馬上想到的聚合函式操作除了 sum 還有哪些?


個人部落格:https://dayarch.top

加我微信好友, 進群娛樂學習交流,備註「進群」

歡迎持續關注公眾號:「日拱一兵」

  • 前沿 Java 技術乾貨分享
  • 高效工具彙總 | 回覆「工具」
  • 面試問題分析與解答
  • 技術資料領取 | 回覆「資料」

以讀偵探小說思維輕鬆趣味學習 Java 技術棧相關知識,本著將複雜問題簡單化,抽象問題具體化和圖形化原則逐步分解技術問題,技術持續更新,請持續關注......


MySQL拼接字串,GROUP_CONCAT 值得擁有

相關文章