1. Tổng quan về biến trong MySQL
Vai trò và tính tiện lợi của biến trong MySQL
Biến MySQL là công cụ hữu ích giúp lưu trữ giá trị trong truy vấn và tái sử dụng chúng trong nhiều truy vấn khác nhau. Điều này giúp tránh việc phải lấy lại dữ liệu nhiều lần, làm cho câu lệnh SQL ngắn gọn và hiệu quả hơn.
Trong MySQL có hai loại biến chính như sau:
- Biến do người dùng định nghĩa: Biến tạm thời được sử dụng trong một phiên làm việc cụ thể.
- Biến hệ thống: Biến cấu hình dùng để điều chỉnh hoạt động của máy chủ MySQL.
Trong phần này, trước tiên chúng ta sẽ tìm hiểu chi tiết về biến do người dùng định nghĩa, sau đó sẽ giải thích cách sử dụng biến hệ thống.
2. Các loại biến trong MySQL
2.1 Biến do người dùng định nghĩa
Biến do người dùng định nghĩa được sử dụng theo phạm vi phiên (session) và không thể truy cập từ client khác. Nhờ đó, bạn có thể tái sử dụng biến một cách an toàn trong cùng một phiên. Biến được khai báo bằng ký hiệu @
.
Ví dụ:
SET @user_id = 123;
SELECT @user_id;
Như trên, bạn có thể dùng SET
để khai báo biến và tái sử dụng giá trị trong truy vấn tiếp theo. Ngoài ra, cũng có thể dùng SELECT INTO
để lưu trực tiếp kết quả vào biến.
SELECT name INTO @user_name FROM users WHERE id = @user_id;
2.2 Biến hệ thống
Biến hệ thống được sử dụng để điều chỉnh cấu hình của MySQL Server. Ví dụ, bạn có thể quản lý số lượng kết nối tối đa hoặc thiết lập thời gian chờ (timeout).
Ví dụ:
SHOW VARIABLES LIKE 'max_connections';
Câu lệnh trên sẽ hiển thị giá trị kết nối đồng thời tối đa của máy chủ MySQL. Biến hệ thống có thể thay đổi bằng lệnh SET
và áp dụng ở cấp độ toàn bộ server hoặc chỉ trong một phiên.

3. Khai báo và sử dụng biến
3.1 Cách khai báo biến
Để khai báo biến, bạn có thể dùng SET
hoặc SELECT INTO
. Với SET
, bạn có thể gán giá trị trực tiếp một cách đơn giản.
Ví dụ:
SET @user_name = 'Sato';
SELECT @user_name;
Trong khi đó, dùng SELECT INTO
cho phép lưu trực tiếp kết quả của truy vấn vào biến.
Ví dụ:
SELECT name INTO @user_name FROM users WHERE id = 123;
3.2 Sử dụng biến trong truy vấn
Biến có thể được sử dụng lại như tham số trong truy vấn. Ví dụ, câu lệnh sau sử dụng biến @user_id
để lấy thông tin người dùng.
Ví dụ:
SELECT * FROM users WHERE id = @user_id;
Như vậy, bạn có thể duy trì dữ liệu trong nhiều truy vấn trong cùng một phiên bằng cách sử dụng biến.
4. Các trường hợp sử dụng phổ biến
4.1 Tối ưu hóa truy vấn
Bằng cách lưu trữ dữ liệu thường xuyên sử dụng vào biến và tái sử dụng trong các truy vấn tiếp theo, hiệu năng có thể được cải thiện.
Ví dụ:
SELECT MAX(id) INTO @max_id FROM users;
Tại đây, ID lớn nhất của người dùng được lưu vào biến để sử dụng lại sau này.
4.2 Xử lý dữ liệu ngày giờ
Bạn có thể dùng biến để xử lý ngày giờ, giúp quản lý dữ liệu chuỗi thời gian dễ dàng hơn.
Ví dụ:
SELECT NOW() INTO @current_time;
SELECT @current_time - INTERVAL 1 DAY INTO @yesterday;
Như vậy, bạn có thể lưu trữ thời gian hiện tại hoặc khoảng thời gian nhất định vào biến để tái sử dụng.

5. Sử dụng biến trong Stored Procedure
Khi sử dụng biến trong Stored Procedure, bạn có thể xử lý logic phức tạp trong một khối lệnh, đồng thời tăng khả năng tái sử dụng mã. Ví dụ dưới đây là một thủ tục lấy thông tin người dùng:
Ví dụ:
CREATE PROCEDURE get_user_info(IN user_id INT, OUT user_name VARCHAR(255))
BEGIN
SELECT name INTO user_name FROM users WHERE id = user_id;
END;
Khi gọi thủ tục này, bạn truyền ID người dùng làm tham số và kết quả sẽ được lưu vào biến.
6. Thực hành tốt khi sử dụng biến
6.1 Tầm quan trọng của việc khởi tạo
Biến nên được khởi tạo trước khi sử dụng. Nếu không, việc tham chiếu đến biến chưa khởi tạo có thể trả về NULL
. Đặc biệt cần chú ý khi dùng biến cho nhiều truy vấn trong cùng một phiên.
6.2 Quản lý phạm vi trong phiên
Biến do người dùng định nghĩa chỉ có hiệu lực trong phạm vi phiên. Khi phiên kết thúc, biến sẽ được đặt lại. Nếu cần sử dụng biến qua nhiều phiên, bạn nên xem xét các phương án khác (ví dụ như bảng tạm).

7. Kỹ thuật nâng cao
7.1 Xử lý dữ liệu với con trỏ (Cursor)
Khi xử lý khối lượng dữ liệu lớn, bạn có thể dùng con trỏ để duyệt từng dòng của kết quả truy vấn. Nhờ đó, dữ liệu có thể được lưu vào biến và xử lý tuần tự.
Ví dụ:
DECLARE cursor_user CURSOR FOR SELECT id, name FROM users;
Sử dụng con trỏ giúp xử lý hiệu quả nhiều dòng dữ liệu.
8. Kết luận
Việc sử dụng biến trong MySQL giúp quản lý truy vấn hiệu quả, tăng tính dễ đọc và hiệu suất của mã. Nếu biết kết hợp hợp lý giữa biến do người dùng định nghĩa và biến hệ thống, bạn có thể thực hiện thao tác dữ liệu tinh gọn hơn. Đặc biệt, khi áp dụng cùng Stored Procedure hoặc Cursor, khả năng xử lý dữ liệu trong MySQL sẽ được cải thiện đáng kể.