Hàm GROUP_CONCAT[] trong MySQL là một loại hàm tổng hợp. Hàm này được sử dụng để nối chuỗi từ nhiều hàng thành một chuỗi bằng nhiều mệnh đề khác nhau. Nếu nhóm chứa ít nhất một giá trị khác null, nó luôn trả về giá trị chuỗi. Nếu không, bạn sẽ nhận được một giá trị null
Sau đây là cú pháp của hàm GROUP_CONCAT[]
HOẶC,
Trong cú pháp này,
- C1, c2,…. ,cN là các cột của bảng
- c_name1 là cột trong bảng có các giá trị sẽ được nối thành một chuỗi cho mỗi nhóm
- c_name2 là cột bảng mà từ đó nhóm được thực hiện
Các tùy chọn của hàm GROUP_CONCAT[] được giải thích bên dưới
Riêng biệt. Mệnh đề này loại bỏ các giá trị trùng lặp trong nhóm trước khi thực hiện nối
Đặt bởi. Nó cho phép chúng ta sắp xếp dữ liệu nhóm theo thứ tự tăng dần hoặc giảm dần rồi thực hiện nối. Theo mặc định, nó thực hiện sắp xếp theo thứ tự tăng dần. Tuy nhiên, bạn có thể sắp xếp các giá trị theo thứ tự giảm dần bằng cách sử dụng tùy chọn DESC một cách rõ ràng
dấu phân cách. Theo mặc định, mệnh đề này sử dụng toán tử dấu phẩy [,] làm dấu phân cách. Nếu bạn muốn thay đổi dấu phân cách mặc định, bạn có thể chỉ định giá trị bằng chữ
GHI CHÚ. Hàm này luôn trả về kết quả ở giá trị chuỗi nhị phân hoặc không nhị phân phụ thuộc vào các đối số đã chỉ định. Theo mặc định, nó trả về độ dài tối đa của giá trị chuỗi bằng 1024. Nếu muốn tăng độ dài này, bạn có thể sử dụng biến hệ thống group_concat_max_len
GROUP_CONCAT[] Ví dụ
Hãy để chúng tôi tạo một bảng employee để hiểu chức năng này hoạt động như thế nào trong MySQL bằng các truy vấn khác nhau
1. Sử dụng một truy vấn đơn giản
Tuyên bố này sẽ cung cấp cho đầu ra sau
2. Sử dụng Mệnh đề DISTINCT
Sau khi thực hiện thành công câu lệnh trên, chúng ta sẽ nhận được đầu ra sau
3. Sử dụng mệnh đề dấu phân cách
Ở đây, mệnh đề dấu phân cách thay đổi chuỗi trả về mặc định dấu phẩy [,] thành dấu chấm phẩy [;] và ký tự khoảng trắng
Câu lệnh trên sẽ cho đầu ra sau
GROUP_CONCAT[] và CONCAT_WS[]
Bây giờ, bạn đã biết hoạt động của hàm GROUP_CONCAT[]. Đôi khi, chúng ta có thể sử dụng hàm này với hàm CONCAT_WS[] để mang lại kết quả hữu ích hơn. Tuyên bố sau đây giải thích nó rõ ràng hơn
Trong câu lệnh này, hàm CONCAT_WS[] trước tiên ghép nối họ và tên của từng nhân viên và cho kết quả là tên đầy đủ của nhân viên. Tiếp theo, chúng tôi sử dụng hàm GROUP_CONCAT[] với mệnh đề phân cách dấu chấm phẩy [;] để tạo danh sách tất cả nhân viên trong một hàng. Cuối cùng, thực hiện tuyên bố. Sau khi thực hiện thành công ta sẽ được kết quả như sau
Hàm này trả về kết quả trong một hàng, không phải danh sách các giá trị. Do đó, chúng ta không thể làm việc với hàm GROUP_CONCAT[] với toán tử IN. Nếu chúng ta sử dụng toán tử IN với hàm này, thì truy vấn sẽ không hoạt động vì toán tử IN chấp nhận danh sách giá trị, không phải chuỗi
Lưu ý rằng điều này chỉ sắp xếp đầu ra của hàm
SELECT PetName
FROM Pets;
9 – nó hoàn toàn độc lập với bất kỳ thứ tự nào được áp dụng cho chính câu lệnh +---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]6
Mệnh đề +---------+
| PetName |
+---------+
| Fluffy |
| Fetch |
| Scratch |
| Wag |
| Tweet |
| Fluffy |
| Bark |
| Meow |
+---------+
8 rows in set [0.00 sec]
7
Chúng ta có thể sử dụng mệnh đề
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]7 để trả về các giá trị duy nhất. Nói cách khác, nếu có các giá trị trùng lặp, chỉ một lần xuất hiện được trả về
SELECT GROUP_CONCAT[DISTINCT PetName ORDER BY PetName ASC]
FROM Pets;
Kết quả
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
Trong trường hợp này,
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]9 chỉ xuất hiện một lần. Khi chúng tôi chạy nó mà không có mệnh đề
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]7, thì
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]9 sẽ xuất hiện hai lần
Thay đổi Dấu phân cách
Theo mặc định, danh sách sử dụng dấu phẩy làm dấu phân cách. Nhưng chúng ta có thể thay đổi điều này nếu chúng ta muốn
SELECT GROUP_CONCAT[PetName SEPARATOR '-']
FROM Pets;
Kết quả
SELECT PetName
FROM Pets;
0Chúng tôi thậm chí có thể sử dụng một chuỗi trống để loại bỏ tất cả các dấu phân cách [để các giá trị được nối với nhau]
SELECT PetName
FROM Pets;
1Và ta được kết quả như sau
SELECT PetName
FROM Pets;
2Kết quả truy vấn được nhóm
Chúng tôi có thể bao gồm
SELECT PetName
FROM Pets;
9 trong truy vấn có mệnh đề +---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]43 để đạt được kết quả như thế này
SELECT PetName
FROM Pets;
3Kết quả
SELECT PetName
FROM Pets;
4Trong cơ sở dữ liệu của tôi, tên loại thú cưng thực tế nằm trong một bảng khác có tên là
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]44. Do đó, chúng tôi có thể chạy một
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]45 trên bảng
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]44 để lấy tên loại vật nuôi thực tế
SELECT PetName
FROM Pets;
5Kết quả
SELECT PetName
FROM Pets;
6Giới hạn độ dài
Đầu ra của
SELECT PetName
FROM Pets;
9 bị cắt bớt theo độ dài tối đa được cung cấp bởi biến hệ thống +---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]48, có giá trị mặc định là
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]49. Giá trị có thể được đặt cao hơn, mặc dù độ dài tối đa hiệu quả của giá trị trả về bị hạn chế bởi giá trị của
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set [0.00 sec]50