mysql 的變數分為四種: 區域性變數 、 使用者變數 、 會話變數 和 全域性變數 ,其中區域性變數只存在於函式和儲存過程,這裡不多了解。其中 會話變數 和 全域性變數 在 mysql 中統稱為 系統變數 。
# 兩種方式都可以
set@variable
= expr
set@variable := expr
# 必須 :=
select
@variable := expr
我們來乙個簡單的示例,實現乙個序號的功能,表和資料如下:
create
table employee (
id int
primary
key,
salary int
notnull);
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
) mwhere rowno =
2;
+--------+-------+
| salary | rowno |
+--------+-------+
| 200 | 2 |
+--------+-------+
實際上在 select 的 where 、 group by 和 order by 中使用者變數都不會按預期操作,它使用的是舊值,不會實時修改。 mysql申明變數以及賦值
sql server中變數要先申明後賦值 區域性變數用乙個 標識,全域性變數用兩個 常用的全域性變數一般都是已經定義好的 申明區域性變數語法 declare 變數名 資料型別 例如 declare num int 賦值 有兩種方法式 num為變數名,value為值 set num value 或 s...
MySql 申明變數以及賦值
sql server中變數要先申明後賦值 區域性變數用乙個 標識,全域性變數用兩個 常用的全域性變數一般都是已經定義好的 申明區域性變數語法 declare 變數名 資料型別 例如 declare num int 賦值 有兩種方法式 num為變數名,value為值 set num value 或 s...
MySql 申明變數以及賦值
sql server中變數要先申明後賦值 區域性變數用乙個 標識,全域性變數用兩個 常用的全域性變數一般都是已經定義好的 申明區域性變數語法 declare 變數名 資料型別 例如 declare num int 賦值 有兩種方法式 num為變數名,value為值 set num value 或 s...