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