Có, nhưng bạn cần di chuyển gán biến vào truy vấn:
SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
Trường hợp kiểm tra:
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
Result:
SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
Lưu ý rằng đối với
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
3, CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
4 hoặc CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
5 có thể được sử dụng làm toán tử gán. Tuy nhiên, bên trong các câu lệnh khác, toán tử gán phải là CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
5 chứ không phải CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
4 vì CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
4 được coi là một toán tử so sánh trong các câu lệnh không đặt.UPDATE:
Hơn nữa để nhận xét bên dưới, bạn cũng có thể làm như sau:
SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
Sử dụng các biến do người dùng xác định trong các câu lệnh SQL
Vấn đề
Bạn muốn lưu một giá trị được tạo ra bởi một biểu thức để bạn có thể tham khảo nó trong một câu lệnh tiếp theo.
Dung dịch
Sử dụng biến do người dùng xác định để lưu trữ giá trị để sử dụng sau.
Thảo luận
Bạn có thể gán một giá trị được trả về bởi câu lệnh
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
9 cho biến do người dùng xác định, sau đó tham khảo biến sau này trong phiên MySQL của bạn. Điều này cung cấp một cách để lưu một kết quả được trả lại từ một tuyên bố, và sau đó tham khảo nó sau trong các tuyên bố khác. Cú pháp gán giá trị cho biến người dùng trong câu lệnh CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
9 là SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
1 SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
2 CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
5 SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
4, trong đó SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
2 là tên biến và SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
4 là giá trị mà bạn đang truy xuất. Biến có thể được sử dụng trong các câu lệnh tiếp theo bất cứ nơi nào cho phép biểu thức, chẳng hạn như trong mệnh đề SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
7 hoặc trong một câu lệnh SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
8.Một tình huống phổ biến trong đó các biến người dùng có ích là khi bạn cần đưa ra các câu lệnh liên tiếp trên nhiều bảng có liên quan bởi một giá trị khóa chung. Giả sử rằng bạn có bảng
SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
9 với cột SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
0 xác định mỗi khách hàng và bảng SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
1 cũng có cột SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
0 để cho biết khách hàng nào mỗi đơn hàng được liên kết. Nếu bạn có tên khách hàng và bạn muốn xóa hồ sơ khách hàng cũng như tất cả các đơn đặt hàng của khách hàng, bạn cần xác định giá trị SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
0 phù hợp cho khách hàng đó, sau đó xóa các hàng khỏi cả hai bảng SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;
+--------+-------+
| user | group |
+--------+-------+
| 123456 | 5 |
| 111111 | 5 |
+--------+-------+
2 rows in set [0.00 sec]
9 và SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
1 khớp với ID. Một cách để làm điều này là trước tiên là lưu giá trị ID trong một biến, sau đó tham khảo biến trong các câu lệnh SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
6:mysql>SELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
Câu lệnh
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
9 trước gán giá trị cột cho một biến, nhưng các biến cũng có thể được gán giá trị từ các biểu thức tùy ý. Câu lệnh sau đây xác định tổng cao nhất của các cột SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
8 và SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group;
SELECT * FROM user WHERE `group` = @group;
9 trong bảng mysql>0 và gán nó cho biếnSELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>1:SELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>SELECT @max_limbs := MAX[arms+legs] FROM limbs;
Một cách sử dụng khác cho một biến là lưu kết quả từ
mysql>2 sau khi tạo một hàng mới trong một bảng có cộtSELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>3:SELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>SELECT @last_id := LAST_INSERT_ID[];
mysql>2 Trả về giá trị của giá trịSELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>3 mới. Bằng cách lưu nó trong một biến, bạn có thể tham khảo giá trị nhiều lần trong các câu lệnh tiếp theo, ngay cả khi bạn đưa ra các câu lệnh khác tạo ra các giá trịSELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>3 của riêng chúng và do đó thay đổi giá trị được trả về bởiSELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>2. Kỹ thuật này được thảo luận thêm trong Chương & NBSP; 11.SELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
Các biến người dùng giữ các giá trị đơn. Nếu bạn gán giá trị cho một biến bằng cách sử dụng câu lệnh trả về nhiều hàng, giá trị từ hàng cuối cùng được sử dụng:
mysql>SELECT @name := thing FROM limbs WHERE legs = 0;
+----------------+ | @name := thing | +----------------+ | squid | | octopus | | fish | | phonograph | +----------------+ mysql>SELECT @name;
+------------+ | @name | +------------+ | phonograph | +------------+
Nếu câu lệnh trả về không có hàng, không có bài tập nào diễn ra và biến giữ lại giá trị trước đó. Nếu biến chưa được sử dụng trước đây, giá trị đó là
mysql>8:SELECT @id := cust_id FROM customers WHERE cust_id='
customer name
';
mysql>DELETE FROM orders WHERE cust_id = @id;
mysql>DELETE FROM customers WHERE cust_id = @id;
mysql>SELECT @name2 := thing FROM limbs WHERE legs < 0;
Empty set [0.00 sec] mysql>SELECT @name2;
+--------+ | @name2 | +--------+ | NULL | +--------+
Để đặt một biến một cách rõ ràng thành một giá trị cụ thể, hãy sử dụng câu lệnh
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
3. CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
3 Cú pháp có thể sử dụng CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
5 hoặc CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
4 để gán giá trị:mysql>SET @sum = 4 + 7;
mysql>SELECT @sum;
+------+ | @sum | +------+ | 11 | +------+
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
3 cũng có thể được sử dụng để gán kết quả CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
9 cho một biến, miễn là bạn viết CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
9 dưới dạng truy vấn con [nghĩa là trong ngoặc đơn] và nó trả về một giá trị duy nhất. Ví dụ:CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
0Một giá trị biến đã nhất định tồn tại cho đến khi bạn gán cho nó một giá trị khác hoặc cho đến khi kết thúc phiên MySQL của bạn, tùy theo điều kiện nào đến trước.
Tên biến người dùng không nhạy cảm trường hợp:
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
1Ghi chú
Trước MySQL 5.0, tên biến người dùng nhạy cảm với trường hợp.are case-sensitive.
Các biến người dùng chỉ có thể xuất hiện khi các biểu thức được cho phép, không phải là nơi các hằng số hoặc định danh theo nghĩa đen phải được cung cấp. Mặc dù nó rất hấp dẫn khi cố gắng sử dụng các biến cho những thứ như tên bảng, nhưng nó không hoạt động. Ví dụ: bạn có thể cố gắng tạo một tên bảng tạm thời bằng cách sử dụng một biến như sau, nhưng nó đã giành được công việc:
CREATE TABLE user [`user` int, `group` int];
INSERT INTO user VALUES [123456, 5];
INSERT INTO user VALUES [111111, 5];
2Các biến người dùng là tiện ích mở rộng dành riêng cho MySQL cho SQL tiêu chuẩn. Họ sẽ không làm việc với các công cụ cơ sở dữ liệu khác.