Để nối nhiều cột (3, 4, 5... cột) thành một chuỗi, MySQL cung cấp 2 hàm chính: CONCAT() và CONCAT_WS() (With Separator).
Cú pháp
1. CONCAT() - Nối trực tiếp, tự thêm dấu phân cách
SELECT CONCAT(cot1, '/', cot2, '/', cot3, '/', cot4) AS ket_qua FROM bang;
2. CONCAT_WS(separator, cot1, cot2, ...) - Nối với dấu phân cách, bỏ qua NULL
SELECT CONCAT_WS('/', cot1, cot2, cot3, cot4) AS ket_qua FROM bang;
So sánh nhanh
| Đặc điểm | CONCAT | CONCAT_WS |
|---|---|---|
| Dấu phân cách | Phải thêm thủ công | Tham số đầu tiên |
| Xử lý NULL | Trả về NULL nếu có bất kỳ NULL | Bỏ qua NULL (rất tiện) |
| Độ dài code | Dài hơn | Ngắn gọn |
| Hiệu năng | Tương đương | Tương đương |
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE MoreThan2ColumnConcat (
Id INT,
Name VARCHAR(20),
Age INT,
Marks INT
);
2. Chèn dữ liệu
INSERT INTO MoreThan2ColumnConcat VALUES
(1, 'John', 24, 89),
(11, 'Larry', 25, 90),
(15, 'Mike', 26, 79),
(16, 'Sam', 21, 99);
3. Nối với CONCAT()
SELECT CONCAT(Id, '/', Name, '/', Age, '/', Marks) AS ConcatMoreFields
FROM MoreThan2ColumnConcat;
Kết quả:
+------------------+
| ConcatMoreFields |
+------------------+
| 1/John/24/89 |
| 11/Larry/25/90 |
| 15/Mike/26/79 |
| 16/Sam/21/99 |
+------------------+
4. Nối với CONCAT_WS() (khuyên dùng)
SELECT CONCAT_WS('/', Id, Name, Age, Marks) AS ConcatMoreFields
FROM MoreThan2ColumnConcat;
Kết quả:** Giống hệt CONCAT nhưng code ngắn hơn.
Ưu điểm lớn của CONCAT_WS: Xử lý NULL tự động
-- Giả sử Age của hàng 2 là NULL
INSERT INTO MoreThan2ColumnConcat VALUES (20, 'Test', NULL, 88);
-- CONCAT: Trả về NULL cho cả hàng
SELECT CONCAT(Id, '/', Name, '/', Age, '/', Marks) FROM ... WHERE Id = 2;
-- Kết quả: NULL ❌
-- CONCAT_WS: Bỏ qua NULL, nối phần còn lại
SELECT CONCAT_WS('/', Id, Name, Age, Marks) FROM ... WHERE Id = 2;
-- Kết quả: '20/Test/88' ✅
Các biến thể hữu ích
Nối với nhiều dấu phân cách khác nhau
-- CONCAT_WS chỉ dùng 1 dấu phân cách
-- Cần dấu khác nhau → dùng CONCAT
SELECT CONCAT(Id, ': ', Name, ' (', Age, ' tuổi, ', Marks, ' điểm)')
FROM MoreThan2ColumnConcat;
Nối tất cả cột của bảng (dynamic)
Nối giá trị duy nhất (GROUP_CONCAT)
SELECT GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR ', ')
FROM MoreThan2ColumnConcat;
Best Practice
- Mặc định dùng CONCAT_WS cho nối cột có thể NULL (tên, địa chỉ, tag...)
- Dùng
CONCATkhi cần kiểm soát chính xác dấu phân cách hoặc format phức tạp - Luôn CAST kiểu số sang CHAR nếu cần:
CONCAT_WS('-', CAST(Id AS CHAR), Name) - Tránh dùng
||(Oracle/PostgreSQL) - MySQL hiểu là OR logic trừ khi bậtPIPES_AS_CONCAT