MySQL的變數長相為@zzzxxxyyy,小老鼠+你想取的名稱,整串@zzzxxxyyy為一個變數。
宣告分兩種,其一外在宣告,其二內在宣告
首先介紹內在宣告,以下將舉例講解︰
先新增測試假資料
CREATE TABLE heyf_t10 (
empid INT ,
deptid INT ,
salary DECIMAL(10, 2)
);
INSERT INTO heyf_t10 VALUES
(1,10,5500.00),
(2,10,4500.00),
(3,20,1900.00),
(4,20,4800.00),
(5,40,6500.00),
(6,40,14500.00),
(7,40,44500.00),
(8,50,6500.00),
(9,50,7500.00);
接著,開始對這些假資料做操作,下方SQL中(SELECT @rownum := 0, @pdept := NULL , @rank := 0) AS a ,這裡就是做初步的變數宣告,而此變數宣告必須給初值,給值的符號為 := 中間不可空格,先宣告後就可以使用了。
SELECT
empid,
deptid,
salary,
rank
FROM
(SELECT
heyf_tmp.empid,
heyf_tmp.deptid,
heyf_tmp.salary,
@rownum := @rownum+1 ,
/*上句意義是,變數@rownum每歷經一筆資料都加1*/
IF(@pdept = heyf_tmp.deptid, @rank := @rank+1, @rank := 1) AS rank,
/*上句意義是,變數@pdept 如果等於deptid值則@rank+1,否則@rank 給值 1*/
@pdept := heyf_tmp.deptid
/*上句意義,變數@pdept給值deptid*/
FROM
(SELECT @rownum := 0, @pdept := NULL , @rank := 0) AS a ,
(SELECT
empid,
deptid,
salary
FROM
heyf_t10
ORDER BY
deptid ASC ,salary DESC
) heyf_tmp
) AS result
結果︰先依照deptid分組,再依照salary來做排序的動作。
以上是內部變數宣告的應用,其實會這樣用的SQL不多見,只是提供個方式可以這樣做而已
接下來介紹外部宣告
外部宣告意即會在主SQL外做額外的SET @zzzxxxyyy宣告的動作,以下將使用範例解說。
SET @A = '測試';
SELECT user.*, @A
FROM user;
上下兩句是相同的,因為是額外的語句做宣告所以可以直接使用 = 號
SET @A := '測試';
SELECT user.*, @A
FROM user;
結果︰@A可以接受到範例中的測試字樣,但其實可以接受任何值
內部宣告沒給初值會錯,外部宣告也會錯,但值得注意的是,內部一錯整句SQL都會錯導致無法執行,但外部宣告的情況將會演變成宣告式是錯的,底下的查詢卻正常運行,而該變數的值就會變成NULL
SET @A;
SELECT user.*, @A
FROM user;
結果︰變數@A沒有得到任何值,皆顯示NULL
其它文章
留言列表