Hướng dẫn mysql variables - biến mysql

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

Giới thiệu về biến trong MySQL

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:

SELECT @variable_name := value;
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)

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:

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;
5

1 ví dụ:

Cách 2: sử dụng SELECT @variable_name := value; 9:

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ến
SELECT 
    @msrp:=MAX(msrp)
FROM
    products;
7:

SELECT 
    @msrp:=MAX(msrp)
FROM
    products;

Hướng dẫn mysql variables - biến mysql

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;

Hướng dẫn mysql variables - biến mysql

Hướng dẫn mysql variables - biến mysql

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;
0

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.