MySQL可以這樣拼接字符串你知道嗎?


MySQL可以這樣拼接字符串你知道嗎?


上一篇文章 https://dayarch.top/p/mysql-cross-table-update.html] 寫了關於跨表個更新的內容。一年過的很快,文中後來的兩位員工 馮大 和 馮二 也要面對無情的 KPI 考核了,他們工作乾的很不錯,performance 分別是 4 和 5


MySQL可以這樣拼接字符串你知道嗎?


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

MySQL可以這樣拼接字符串你知道嗎?


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


GROUP_CONCAT(expr)

在 https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat 中,該函數被放在聚合函數章節,如果你要按照指定字段分組拼接,就要配合關鍵字 GROUP BY 來使用的

MySQL可以這樣拼接字符串你知道嗎?


定義


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

<code>GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])/<code>


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


使用案例


先完成文章開頭的需求:

<code>SELECT performance, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY performance;/<code>


zou是這個結果:

MySQL可以這樣拼接字符串你知道嗎?


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


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


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

MySQL可以這樣拼接字符串你知道嗎?


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


<code>SELECT GROUP_CONCAT(DISTINCT home_town)
FROM employees;/<code>


來看結果:

MySQL可以這樣拼接字符串你知道嗎?


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


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

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

-- 沒我這麼起變量的哈,還是漢語,我看你是瘋了/<code>


MySQL可以這樣拼接字符串你知道嗎?


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


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

<code>SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '領導關懷地區'
FROM employees;/<code>


MySQL可以這樣拼接字符串你知道嗎?


<code>SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '領導關懷地區'
FROM employees;/<code>


MySQL可以這樣拼接字符串你知道嗎?


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


領導的關懷能力也有限,拼接的字符串默認的最大長度是1024個字符,可以通過下面語句查看當前限制是多少:


<code>show variables like 'group_concat_max_len';/<code>


MySQL可以這樣拼接字符串你知道嗎?


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


<code>SET [GLOBAL | SESSION] group_concat_max_len = val;/<code>


  • SESSION: 在當前對話中生效
  • GLOBAL:全局都生效

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


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


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

<code>SELECT
GROUP_CONCAT(
CONCAT_WS(', ', contactLastName, contactFirstName)
SEPARATOR ';')
FROM
customers;/<code>


這裡是 https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_concat-ws, 很簡單,請自行查看吧......


注意⚠️

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


<code>SELECT
id, name
FROM
table_name
WHERE
id IN GROUP_CONCAT(id);/<code>


總結

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


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

靈魂追問


  1. 聚合函數和 group by 搭配有哪些限制?
  2. 你能馬上想到的聚合函數操作除了 sum 還有哪些?


趣味原創解析Java技術棧問題,將複雜問題簡單化,將抽象問題圖形化落地

如果對我的專題內容感興趣,或搶先看更多內容,歡迎訪問我的博客 https://dayarch.top


分享到:


相關文章: