mysql用戶自定義變量


  可以先在用戶變量中保存值然后在以后引用它;這樣可以將值從一個語句傳遞到另一個語句。用戶變量與連接有關。也就是說,一個客戶端定義的變量不能被其它客戶端看到或使用。當客戶端退出時,該客戶端連接的所有變量將自動釋放。

  用戶變量的形式為@var_name,其中變量名var_name可以由當前字符集的文字數字字符、‘.’、‘_’和‘$’組成。 默認字符集是cp1252 (Latin1)。可以用mysqld的--default-character-set選項更改字符集。用戶變量名對大小寫不敏感。

設置用戶變量的一個途徑是執行SET語句:

SET @var_name = expr [, @var_name = expr] ...

對於SET,可以使用=或:=作為分配符。分配給每個變量的expr可以為整數、實數、字符串或者NULL值。

也可以用語句代替SET來為用戶變量分配一個值。在這種情況下,分配符必須為:=而不能用=,因為在非SET語句中=被視為一個比較 操作符:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

用戶變量可以用於表達式中。目前不包括明顯需要文字值的上下文中,例如SELECT語句的LIMIT子句,或者LOAD DATA語句的IGNORE number LINES子句。

如果使用沒有初始化的變量,其值是NULL。

如果用戶變量分配了一個字符串值,其字符集和校對規則與該字符串的相同。用戶變量的可壓縮性(coercibility)是隱含的。(即為表列值的相同的可壓縮性(coercibility)。

注釋:在SELECT語句中,表達式發送到客戶端后才進行計算。這說明在HAVING、GROUP BY或者ORDER BY子句中,不能使用包含SELECT列表中所設的變量的表達式。例如,下面的語句不能按期望工作:

mysql> SELECT (@aa:=id) AS a,(@aa+3) AS b 從tbl_name HAVING b=5;

HAVING子句中引用了SELECT列表中的表達式的別名,使用@aa。不能按期望工作:@aa不包含當前行的值,而是前面所選的行的id值。

一般原則是不要在語句的一個部分為用戶變量分配一個值而在同一語句的其它部分使用該變量。可能會得到期望的結果,但不能保證。

設置變量並在同一語句中使用它的另一個問題是變量的默認結果的類型取決於語句前面的變量類型。下面的例子說明了該點:

mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;

對於該 SELECT語句,MySQL向客戶端報告第1列是一個字符串,並且將@a的所有訪問轉換為字符串,即使@a在第2行中設置為一個數字。執行完SELECT語句后,@a被視為下一語句的一個數字。

要想避免這種問題,要么不在同一個語句中設置並使用相同的變量,要么在使用前將變量設置為0、0.0或者''以定義其類型。

未分配的變量有一個值NULL,類型為字符串。

 

例如:

SET @a='test';
SELECT @a

 

結果:

 

 

 

例二:

自定義變量顯示行號

SELECT (@rowNum:=@rowNum+1) AS rowNum,test2.* FROM test2,(SELECT(@rowNum:=0)) b

 

結果:

 

 

 

例三:

將列設為變量,並對兩列進行除法運算后格式化處理

SELECT
  depart.departmentid,
  depart.updepartmentId,
  depart.departmentname,
  depart.departmenttype,
  depart.departprojectnames,
(SELECT
     departmentName
   FROM department
   WHERE departmentId = depart.upDepartmentId) AS upDepartName,
  depart.employeeName,
  depart.sort,
  depart.phone,
   @a:= (SELECT
     COUNT(employeeId)
   FROM employee_in
   WHERE departmentId = depart.departmentId) AS perNum,
  @b:=  IFNULL((SELECT SUM(empInMinusNum) FROM emplyin_breakrules, employee_in WHERE emplyin_breakrules.empInEmployeeId = employee_in.employeeId AND employee_in.departmentId = depart.departmentId),0) AS totalMinus,
 TRUNCATE(IFNULL(@a/@b,0),3) AS jiaquan
FROM department depart
ORDER BY jiaquan

 

@a:=    @b:=  是定義了兩個變量,為查出的列的值。

TRUNCATE(IFNULL(@a/@b,0),3)   是取兩個值進行除法運算,然后保留三位小數,並按除的結果進行降序排序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM