Bài viết này sẽ hướng dẫn cách sử dụng biến trong các câu lệnh SQL Biến trong câu lệnh SQL dùng để tái sử dụng ở nhiều chỗ trong nhiều câu lệnh SQL khác. Cú pháp đặt biến: Giới thiệu về biến trong MySQL
1, trong đó SELECT @variable_name := value;
2 là các ký tự alphanumeric. Độ dài tối đa của biến là 64 ký tự [trong MySQL 5.7.5]SELECT @variable_name := value;
Biến không phân biệt chữ hoa chữ thường. 2 biến
SELECT @variable_name := value;
3 và SELECT @variable_name := value;
4 là như nhau.Kiểu biến có thể là: integer, floating point, decimal, string hoặc NULL.
Biến khi được định nghĩa chỉ có thể sử dụng trong cùng 1 session và sẽ không lưu lại cho các session sau.
Lưu ý: cách định nghĩa biến này chỉ trên MySQL có thể sẽ không đúng trong 1 số các hệ thống database khác.
Gán giá trị cho biến
Có 2 cách để gán giá trị cho biến.
Cách 1: sử dụng SELECT @variable_name := value;
5:
SELECT @variable_name := value;
SET @variable_name := value;
Cả 2 toán tử
SELECT @variable_name := value;
6 hoặc SELECT @variable_name := value;
7 đều dùng được với SELECT @variable_name := value;
51 ví dụ:
Cách 2: sử dụng SELECT @variable_name := value;
9:
SELECT @variable_name := value;
Chỉ được phép sử dụng toán tử
SELECT @variable_name := value;
6 trong lệnh SELECT @variable_name := value;
9. Toán tử SELECT @variable_name := value;
7 sẽ hiểu nhầm là toán tử so sánh bằng trong trường hợp này.SELECT @variable_name := value;
Sau khi gán giá trị biến. Bạn có thể sử dụng ở các lệnh SQL khác như trong mệnh đề
SELECT
@msrp:=MAX[msrp]
FROM
products;
3, lệnh SELECT
@msrp:=MAX[msrp]
FROM
products;
4 hoặc SELECT
@msrp:=MAX[msrp]
FROM
products;
5.Ví dụ khai báo biến trong MySQL
Giả sử bạn muốn lấy danh sách các sản phẩm đắt nhất trong bảng
SELECT
@msrp:=MAX[msrp]
FROM
products;
6 và gán vào biếnSELECT
@msrp:=MAX[msrp]
FROM
products;
7:SELECT
@msrp:=MAX[msrp]
FROM
products;
Chúng ta sẽ sử dụng biến
SELECT
@msrp:=MAX[msrp]
FROM
products;
7 để lấy thông tin sản phẩm đắt nhất:SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
Trong 1 vài trường hợp, bạn sẽ phải chèn dữ liệu vào 1 bảng, sau đó lấy giá trị
SELECT
@msrp:=MAX[msrp]
FROM
products;
9 vừa mới chèn và sử dụng để chèn dữ liệu vào 1 bảng khác. Trường hợp này bạn có thể sử dụng biến để lưu giá trị SELECT
@msrp:=MAX[msrp]
FROM
products;
9 mới nhất, được tạo bởi SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
1.SELECT @id:=LAST_INSERT_ID[];
Biến chỉ có thể lưu 1 giá trị, nếu lệnh
SELECT @variable_name := value;
9 trả về nhiều giá trị, biến sẽ lấy giá trị của dòng cuối cùng trong kết quả trả về.SELECT
@buyPrice:=buyprice
FROM
products
WHERE
buyprice > 95
ORDER BY buyprice;
Như vậy là các bạn có thể sử dụng biến trong MySQL với nhiều mục đích khác nhau.
Hi vọng bài viết hữu ích cho bác bạn.
Hãy like, share và comment để cùng học tập nhé.
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à
SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
3, trong đó tên biến SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
4 bao gồm các ký tự chữ và số, SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
5, SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
6 và SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
7. 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ụ: SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
8, SELECT
productCode, productName, productLine, msrp
FROM
products
WHERE
msrp = @msrp;
9 hoặc SELECT @id:=LAST_INSERT_ID[];
0].
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ố
SELECT @variable_name := value;
5:SET @var_name = expr [, @var_name = expr] ...
Đối với
SELECT @variable_name := value;
5, SELECT @variable_name := value;
7 hoặc SELECT @variable_name := value;
6 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ị
SELECT @id:=LAST_INSERT_ID[];
6. 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 SELECT @id:=LAST_INSERT_ID[];
7 được chuyển đổi thành một chuỗi với bộ ký tự SELECT @id:=LAST_INSERT_ID[];
8 và đối chiếu SELECT @id:=LAST_INSERT_ID[];
9.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
SELECT
@buyPrice:=buyprice
FROM
products
WHERE
buyprice > 95
ORDER BY buyprice;
0: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ị
SELECT @id:=LAST_INSERT_ID[];
6 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 đề
SELECT
@buyPrice:=buyprice
FROM
products
WHERE
buyprice > 95
ORDER BY buyprice;
2 của câu lệnh SELECT @variable_name := value;
9 hoặc mệnh đề dòng SELECT
@buyPrice:=buyprice
FROM
products
WHERE
buyprice > 95
ORDER BY buyprice;
4 của câu lệnh SELECT
@buyPrice:=buyprice
FROM
products
WHERE
buyprice > 95
ORDER BY buyprice;
5.
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 với
SELECT @variable_name := value;
5. 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
SELECT @variable_name := value;
6 làm toán tử chuyển nhượng; SELECT @variable_name := value;
7 được coi là toán tử so sánh trong các tuyên bố khác với SELECT @variable_name := value;
5.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
SET @var_name = expr [, @var_name = expr] ...
0 đánh giá SET @var_name = expr [, @var_name = expr] ...
1 trước 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
SET @var_name = expr [, @var_name = expr] ...
2, SET @var_name = expr [, @var_name = expr] ...
3 hoặc SET @var_name = expr [, @var_name = expr] ...
4 để xác định loại của nó trước khi bạn sử dụng.
SET @var_name = expr [, @var_name = expr] ...
5, SET @var_name = expr [, @var_name = expr] ...
6 và SET @var_name = expr [, @var_name = expr] ...
7, 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ư
SELECT @variable_name := value;
9. Đ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:
SELECT @variable_name := value;
0Việ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”.