Sử dụng biến người dùng (user-defined variable) với tiền tố @ và lệnh SET để lưu giá trị tạm thời trong session.
Tạo bảng
mysql> CREATE TABLE DemoTable (Id INT, FirstName VARCHAR(20), LastName VARCHAR(20));
Chèn dữ liệu
mysql> INSERT INTO DemoTable VALUES(10, 'Carol', 'Taylor'), (20, 'John', 'Doe'), (30, 'John', 'Smith'), (40, 'David', 'Miller');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------+-----------+----------+ | Id | FirstName | LastName | +------+-----------+----------+ | 10 | Carol | Taylor | | 20 | John | Doe | | 30 | John | Smith | | 40 | David | Miller | +------+-----------+----------+
Đặt biến và sử dụng trong WHERE
mysql> SET @myId := 30; mysql> SELECT * FROM DemoTable WHERE Id = @myId;
+------+-----------+----------+ | Id | FirstName | LastName | +------+-----------+----------+ | 30 | John | Smith | +------+-----------+----------+
Cú pháp SET biến
| Cú pháp | Ví dụ | Ghi chú |
|---|---|---|
SET @var = value | SET @x = 10 | Phép gán (có thể gây nhầm lẫn với so sánh trong SELECT) |
SET @var := value | SET @x := 10 | Rõ ràng là gán (khuyên dùng) |
SELECT @var := value | SELECT @x := 10 | Gán trong SELECT |
Phạm vi biến
@var: Session variable — tồn tại suốt kết nối, chỉ session hiện tại thấy@@var: System variable (global/session)DECLARE var: Local variable — chỉ trong BEGIN...END (Stored Procedure/Function/Trigger)
Ứng dụng thực tế
-- Lưu kết quả truy vấn vào biến SELECT @max_id := MAX(Id) FROM DemoTable; SELECT * FROM DemoTable WHERE Id = @max_id; -- Dùng trong IN SET @ids = '10,20,30'; SELECT * FROM DemoTable WHERE FIND_IN_SET(Id, @ids); -- Không tối ưu -- Prepared Statement (an toàn hơn, tránh SQL injection) PREPARE stmt FROM 'SELECT * FROM DemoTable WHERE Id = ?'; SET @param = 30; EXECUTE stmt USING @param; DEALLOCATE PREPARE stmt;
Prepared Statement vs User Variable
Prepared Statement an toàn hơn (parameterized), hiệu năng tốt hơn (parse once), nên dùng trong ứng dụng. Biến @ phù hợp cho ad-hoc query, script, debug.