MySQL声明变量以及赋值

MySQL 的变量分为四种: 局部变量 、 用户变量 、 会话变量 和 全局变量 ,其中局部变量只存在于函数和存储过程,这里不多了解。其中 会话变量 和 全局变量 在 MySQL 中统称为 系统变量 。

用户变量

SET 方式

# 两种方式都可以
SET @variable = expr
SET @variable := expr

SELECT 方式

# 必须 :=
SELECT @variable := expr

示例

我们来一个简单的示例,实现一个序号的功能,表和数据如下:

CREATE TABLE employee (
   id int primary key,
   salary int not null
);

INSERT INTO employee VALUES(1, 100);
INSERT INTO employee VALUES(2, 200);
INSERT INTO employee VALUES(3, 300);

根据之前学习的内容,我们可以很快的写出如下 SQL:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r;
+--------+-------+
| salary | rowno |
+--------+-------+
|    100 |     1 |
|    200 |     2 |
|    300 |     3 |
+--------+-------+

没有问题,一切都和预期一样,然后我们加一个 WHERE 条件试试:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r
WHERE @rowno = 0;
+--------+-------+
| salary | rowno |
+--------+-------+
|    100 |     1 |
+--------+-------+

理论上来说,这是不应该返回数据的,但是它还就是返回了一条数据,就是 id 为 1 的那条。

为什么呢? WHERE 条件使用的 @rowno 一直都是同一个值 0 ,它不会因为 SELECT 上修改了就实时响应 。要实现 WHERE 的功能需要改写成如下:

SELECT salary, rowno
FROM (
    SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
    FROM employee, (SELECT @rowno := 0) r
) m
WHERE rowno = 2;
+--------+-------+
| salary | rowno |
+--------+-------+
|    200 |     2 |
+--------+-------+

实际上在 SELECT 的 WHERE 、 GROUP BY 和 ORDER BY 中用户变量都不会按预期操作,它使用的是旧值,不会实时修改。

本文转载于:MySQL 之变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值