Hướng dẫn mysql variable in query - biến mysql trong truy vấn

Bạn có thể lưu trữ một giá trị trong một biến do người dùng xác định trong một câu lệnh và tham khảo nó sau trong một câu lệnh khác. Điều này cho phép bạn chuyển các giá trị từ câu lệnh này sang câu lệnh khác.

Các biến người dùng được viết là @var_name, trong đó tên biến var_name bao gồm các ký tự chữ và số, ., _$. Tên biến người dùng có thể chứa các ký tự khác nếu bạn trích dẫn nó dưới dạng chuỗi hoặc mã định danh [ví dụ: ____10,

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
1 hoặc
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
2].

Các biến do người dùng xác định là cụ thể phiên. Một biến người dùng được xác định bởi một máy khách không thể được nhìn thấy hoặc sử dụng bởi các máy khách khác. .

Tên biến người dùng không nhạy cảm trường hợp. Tên có độ dài tối đa 64 ký tự.

Một cách để đặt biến do người dùng xác định là bằng cách đưa ra tuyên bố

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
4:

SET @var_name = expr [, @var_name = expr] ...

Đối với

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
4,
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
6 hoặc
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
7 có thể được sử dụng làm toán tử gán.

Các biến người dùng có thể được gán một giá trị từ một tập hợp các loại dữ liệu giới hạn: số nguyên, thập phân, điểm nổi, chuỗi nhị phân hoặc không phân giải hoặc giá trị

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
8. Việc gán các giá trị thập phân và giá trị thực không bảo tồn độ chính xác hoặc tỷ lệ của giá trị. Một giá trị của một loại khác với một trong các loại cho phép được chuyển đổi thành một loại cho phép. Ví dụ, một giá trị có kiểu dữ liệu theo thời gian hoặc không gian được chuyển đổi thành chuỗi nhị phân. Một giá trị có kiểu dữ liệu
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
9 được chuyển đổi thành một chuỗi với bộ ký tự
mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
0 và đối chiếu
mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
1.

Nếu một biến người dùng được gán một giá trị chuỗi [ký tự] không phải, nó có cùng một bộ ký tự và đối chiếu như chuỗi. Khả năng cưỡng chế của các biến người dùng là ẩn. [Đây là khả năng ép buộc giống như đối với các giá trị cột bảng.]

Giá trị thập lục phân hoặc bit được gán cho các biến người dùng được coi là chuỗi nhị phân. Để gán giá trị thập lục phân hoặc bit làm số cho biến người dùng, hãy sử dụng nó trong bối cảnh số. Ví dụ: thêm 0 hoặc sử dụng

mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
2:

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+

Nếu giá trị của biến người dùng được chọn trong một tập kết quả, nó sẽ được trả lại cho máy khách dưới dạng chuỗi.

Nếu bạn đề cập đến một biến chưa được khởi tạo, nó có giá trị là

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
8 và một loại chuỗi.

Bắt đầu với MySQL 8.0.22, tham chiếu đến biến người dùng trong câu lệnh đã chuẩn bị có loại được xác định khi câu lệnh được chuẩn bị đầu tiên và giữ lại loại này mỗi khi câu lệnh được thực thi sau đó. Tương tự, loại biến người dùng được sử dụng trong một câu lệnh trong quy trình được lưu trữ được xác định ngay lần đầu tiên quy trình được lưu trữ được gọi và giữ lại loại này với mỗi lần gọi tiếp theo.

Các biến người dùng có thể được sử dụng trong hầu hết các bối cảnh nơi các biểu thức được cho phép. Điều này hiện không bao gồm các bối cảnh yêu cầu rõ ràng một giá trị theo nghĩa đen, chẳng hạn như trong mệnh đề

mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
4 của câu lệnh
mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
5 hoặc mệnh đề dòng
mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
6 của câu lệnh
mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
7.

Các bản phát hành trước của MySQL đã cho phép gán giá trị cho biến người dùng trong các câu lệnh khác ngoài

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
4. Chức năng này được hỗ trợ trong MySQL 8.0 để tương thích ngược nhưng có thể loại bỏ trong một bản phát hành trong tương lai của MySQL.

Khi thực hiện một bài tập theo cách này, bạn phải sử dụng

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
7 làm toán tử chuyển nhượng;
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
6 được coi là toán tử so sánh trong các tuyên bố khác với
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST[X'41' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST[b'1000001' AS UNSIGNED];
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+
4.

Thứ tự đánh giá cho các biểu thức liên quan đến các biến người dùng không được xác định. Ví dụ, không có gì đảm bảo rằng

mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
2 đánh giá
mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
3 trước tiên và sau đó thực hiện bài tập.

Ngoài ra, loại kết quả mặc định của một biến dựa trên loại của nó ở đầu câu lệnh. Điều này có thể có các hiệu ứng ngoài ý muốn nếu một biến chứa một giá trị của một loại khi bắt đầu một câu lệnh trong đó nó cũng được gán một giá trị mới của một loại khác.

Để tránh các vấn đề với hành vi này, hoặc không gán giá trị và đọc giá trị của cùng một biến trong một câu lệnh, hoặc nếu không đặt biến thành

mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
4,
mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
5 hoặc
mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
6 để xác định loại của nó trước khi bạn sử dụng.

mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
7,
mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
8 và
mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]
9, khi đề cập đến một biến được gán một giá trị trong danh sách biểu thức chọn không hoạt động như mong đợi vì biểu thức được đánh giá trên máy khách và do đó có thể sử dụng các giá trị cột cũ từ hàng trước.

Các biến người dùng được dự định để cung cấp giá trị dữ liệu. Chúng không thể được sử dụng trực tiếp trong câu lệnh SQL như một định danh hoặc là một phần của mã định danh, chẳng hạn như trong các bối cảnh mà tên bảng hoặc cơ sở dữ liệu được mong đợi hoặc như một từ dành riêng như

mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]
5. Điều này đúng ngay cả khi biến được trích dẫn, như trong ví dụ sau:

mysql> SELECT c1 FROM t;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> SET @col = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| c1   |
+------+
1 row in set [0.00 sec]

mysql> SELECT `@col` FROM t;
ERROR 1054 [42S22]: Unknown column '@col' in 'field list'

mysql> SET @col = "`c1`";
Query OK, 0 rows affected [0.00 sec]

mysql> SELECT @col FROM t;
+------+
| @col |
+------+
| `c1` |
+------+
1 row in set [0.00 sec]

Một ngoại lệ đối với nguyên tắc này mà các biến người dùng không thể được sử dụng để cung cấp số nhận dạng, là khi bạn đang xây dựng một chuỗi để sử dụng như một câu lệnh đã chuẩn bị để thực thi sau.Trong trường hợp này, các biến người dùng có thể được sử dụng để cung cấp bất kỳ phần nào của câu lệnh.Ví dụ sau đây minh họa cách thực hiện điều này:

mysql> SET @c = "c1";
Query OK, 0 rows affected [0.00 sec]

mysql> SET @s = CONCAT["SELECT ", @c, " FROM t"];
Query OK, 0 rows affected [0.00 sec]

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected [0.04 sec]
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set [0.00 sec]

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected [0.00 sec]

Xem Phần & NBSP; 13.5, Câu lệnh đã chuẩn bị, để biết thêm thông tin.

Một kỹ thuật tương tự có thể được sử dụng trong các chương trình ứng dụng để xây dựng các câu lệnh SQL bằng các biến chương trình, như được hiển thị ở đây bằng cách sử dụng Php 5:

Việc lắp ráp một tuyên bố SQL theo kiểu này đôi khi được gọi là SQL Dynamic SQL.Dynamic SQL.

Bài Viết Liên Quan

Chủ Đề