close

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


 















其它文章

arrow
arrow

    PG Levin Li 發表在 痞客邦 留言(0) 人氣()