MySQL cho phép gán và sử dụng **biến người dùng (user-defined variable)** có tiền tố @ ngay trong truy vấn. Kết hợp với CONCAT_WS() để nối chuỗi và gán vào biến, kết quả sẽ hiển thị trong bảng kết quả.
Cú pháp
SELECT @ten_bien := BIEN_THUC FROM ten_bang;
Biến sẽ mang giá trị của **hàng cuối cùng** sau khi duyệt xong (vì gán lần lượt từng hàng).
Ví dụ minh họa
Tạo bảng sinh viên:
mysql> CREATE TABLE DemoTable1508 (
-> StudentFirstName VARCHAR(20),
-> StudentLastName VARCHAR(20)
-> );
mysql> INSERT INTO DemoTable1508 VALUES
-> ('Chris','Brown'), ('David','Miller'), ('John','Doe');
Gán biến @FullName = nối tên-họ bằng '-', hiển thị:
mysql> SELECT @FullName := CONCAT_WS('-', StudentFirstName, StudentLastName)
-> FROM DemoTable1508;
Kết quả (3 hàng, giá trị biến cập nhật dần):
+------------------------------------------------------------+
| @FullName:=CONCAT_WS('-',StudentFirstName,StudentLastName) |
+------------------------------------------------------------+
| Chris-Brown |
| David-Miller |
| John-Doe |
+------------------------------------------------------------+
Sau truy vấn, @FullName giữ giá trị 'John-Doe' (hàng cuối).
Các hàm nối chuỗi hữu ích
| Hàm | Mô tả | Ví dụ |
|---|---|---|
CONCAT_WS(sep, str1, str2,...) | Nối với phân cách, bỏ qua NULL | CONCAT_WS('-', 'a', NULL, 'c') → 'a-c' |
CONCAT(str1, str2,...) | Nối trực tiếp, NULL → kết quả NULL | CONCAT('a', NULL, 'c') → NULL |
GROUP_CONCAT | Nối nhiều hàng thành 1 chuỗi | Xem bài GROUP_CONCAT |
Lưu ý
- Biến @ten_bien là **session-scoped** – chỉ tồn tại trong kết nối hiện tại.
- Không dùng trong prepared statement an toàn (giá trị có thể không như kỳ vọng do tối ưu hóa).
- Để gán một lần cho toàn bộ tập kết quả, dùng
SELECT @var := ... FROM ... LIMIT 1hoặc subquery.