MySQL GROUP_CONCAT() 函數完整教學:用法、語法與實用範例

1. MySQL GROUP_CONCAT() 函數的基本用法

GROUP_CONCAT() 是 MySQL 的一個聚合函數,用於將多行的值連接成一個字串。透過這個函數,可以將多筆資料彙整到同一個欄位中。特別是在需要高效顯示資料彙總或統計結果時,非常實用。

基本語法

GROUP_CONCAT() 的基本語法如下:

SELECT GROUP_CONCAT(column_name) FROM table_name GROUP BY column_name;

此函數通常會與 GROUP BY 子句一起使用。例如,下列查詢會將員工姓名依部門彙整成清單:

SELECT department, GROUP_CONCAT(employee_name) FROM employees GROUP BY department;

執行後,每個部門下的員工姓名會以逗號分隔的字串形式回傳。

2. GROUP_CONCAT() 的自訂選項

GROUP_CONCAT() 不僅能連接值,還能進行多種自訂,例如更改分隔符號、刪除重複資料、指定排序方式等,讓使用更靈活。

2.1 更改分隔符號

預設情況下,GROUP_CONCAT() 使用逗號作為分隔符號。不過,透過 SEPARATOR 關鍵字可以更改。例如,下列查詢將員工姓名用分號隔開:

SELECT department, GROUP_CONCAT(employee_name SEPARATOR '; ') AS employees
FROM employees
GROUP BY department;

這樣輸出的結果會以分號區隔員工姓名。

2.2 移除重複資料

預設情況下,GROUP_CONCAT() 會連接所有值(包含重複)。若要去除重複,可加上 DISTINCT。以下範例會去掉重複的員工姓名:

SELECT department, GROUP_CONCAT(DISTINCT employee_name) AS employees
FROM employees
GROUP BY department;

2.3 結果排序

GROUP_CONCAT() 可以指定輸出順序,透過 ORDER BY 可設定升冪或降冪。以下範例將員工姓名依字母順序排列:

SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department;

執行後,員工姓名會依字母升冪排列。若要改為降冪,則使用 DESC

3. GROUP_CONCAT() 的應用範例

3.1 建立分類產品清單

利用 GROUP_CONCAT(),可以將同一分類下的產品列出。例如,下列查詢會依分類將產品名稱按字母順序排列:

SELECT category, GROUP_CONCAT(product_name ORDER BY product_name ASC) AS product_list
FROM products
GROUP BY category;

輸出結果如下:

category      product_list
Electronics   Laptop, Phone, TV
Furniture     Sofa, Table

 

3.2 結合多個欄位

若要將多個欄位結合,可在 GROUP_CONCAT() 中使用 CONCAT()。以下範例會將產品 ID 與名稱以冒號連接:

SELECT category, GROUP_CONCAT(CONCAT(product_id, ':', product_name) ORDER BY product_name) AS product_info
FROM products
GROUP BY category;

執行後會回傳每個分類下的產品 ID 與名稱字串。

4. GROUP_CONCAT() 的限制與效能調整

在使用 GROUP_CONCAT() 時,預設最大輸出長度限制為 1024 字元。處理大量資料時,也需要注意效能問題。

4.1 修改最大字串長度

若超過預設長度,可以透過調整 session 設定更改。例如,將最大長度設為 10,000 位元組:

SET SESSION group_concat_max_len = 10000;

這樣即可處理更大的資料集。

4.2 效能最佳化

在處理大量資料時,GROUP_CONCAT() 的效能可能下降,特別是搭配 DISTINCTORDER BY 時。最佳化方式如下:

  • 使用索引:對 GROUP BY 的欄位建立索引,以提升查詢效能。
  • 設定適當的最大長度:調整 group_concat_max_len,避免不必要的大量輸出。

5. 與其他聚合函數的比較

GROUP_CONCAT() 的功能與其他聚合函數(如 COUNT()SUM())不同。以下介紹與 COUNT() 的差異。

5.1 與 COUNT() 的不同

COUNT() 用於計算符合條件的行數;而 GROUP_CONCAT() 則將值連接為字串。例如,以下查詢會計算每個部門的員工數:

SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department;

這樣即可獲取各部門的員工數。

6. 總結

GROUP_CONCAT() 是 MySQL 中非常靈活的聚合函數,可以將資料組合成字串,並支援自訂與進階應用,對於資料視覺化與報表製作特別有幫助。但需注意輸出長度限制與效能問題,並適度調整參數。搭配其他聚合函數使用時,能實現更高效的資料處理。