Rumah > pangkalan data > tutorial mysql > Mysql User-Defined Variables 用户自定义变量 SET or DECLARE_MySQL

Mysql User-Defined Variables 用户自定义变量 SET or DECLARE_MySQL

WBOY
Lepaskan: 2016-05-31 08:48:34
asal
1154 orang telah melayarinya

在MySQL中,我们可以将一个值或一个查询结果保存的一个用户自定义的变量中,然后在后面的语句在应用。

SET定义变量;

SET @var_name := expr [, @var_name = expr ] ....
SET @var_name = expr [, @var_name = expr ] ....
注意:①这里用 ":=" or "="都行,但是"="在其他statement语句中有相等的意思,容易混淆,有时也会出错。强烈建议用 ":="。②在语句里,可以直接用@var_name = expr定义用,不提倡这样,相当于不声明直接用。

下面给出一些例子:

简单的定义,显示


mysql> <code><strong>SET @t1=1, @t2=2, @t3</strong>:=<strong>4;</strong></code>mysql> <code>SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;</code>+------+------+------+--------------------+| @t1  | @t2  | @t3  | @t4 := @t1+@t2+@t3 |+------+------+------+--------------------+|    1 |    2 |    4 |                  7 | +------+------+------+--------------------+
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Someone use them for rank

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
SET @pos <strong>:= </strong>0;  #这里用等号,感觉像是逻辑判断,结果也不对了<br>SELECT @pos:=@pos+1 as rank,name FROM players ORDER BY score DESC;
Salin selepas log masuk
<strong></strong>
Salin selepas log masuk

print only the 100th users

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
<strong>SET</strong> @counter:=0;<strong>SELECT</strong>    users.*<strong>FROM</strong>    users<strong>HAVING</strong>    (@counter:=@counter+1)%100=0<strong>ORDER BY</strong>    user_id;
Salin selepas log masuk

保存查询结果值value:

SELECT @total := COUNT(*)     FROM  table_name;  # simicolon 分割连个语句SELECT     table_name.id    COUNT(*) AS 'count',    COUNT(*) /     <strong>(SELECT         @total)</strong> AS percent FROM    table_name,WHERE 1=1GROUP BY YEAR(birthday)ORDER BY YEAR(birthday)
Salin selepas log masuk
注意上面这个SQL语句看起来逻辑清晰,但与下面的语句执行效果和时间都一样(可能MySQL内部优化了)
Salin selepas log masuk
SELECT     table_name.id    COUNT(*) AS 'count',    COUNT(*) /     <strong>(SELECT </strong>
Salin selepas log masuk
        COUNT(*) 
Salin selepas log masuk
     FROM 
Salin selepas log masuk
        table_name) AS percent 
Salin selepas log masuk
FROM    table_name,WHERE 1=1GROUP BY YEAR(birthday)ORDER BY YEAR(birthday)
Salin selepas log masuk
其他一些例子:
Salin selepas log masuk
http://www.mysqldiary.com/user-defined-variables/
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
疑问:
Salin selepas log masuk
这里的变量只能保存一个结果值,如何才能临时保存一个select出的结果集呢。
Salin selepas log masuk
当然简单的方法是创建表/视图; 或者临时表 ,还有好的方法呢? 待研究。
Salin selepas log masuk
 
Salin selepas log masuk

DECLARE声明变量,然后在赋值

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
DECLARE @var_name  var_type
Salin selepas log masuk
这里举个例子:
Salin selepas log masuk
<strong>例1:</strong>
Salin selepas log masuk
DECLARE @total INT DECLARE @total_distinct INTSELECT     @total:=COUNT(lice_no)    #using ":=" notationFROM    table_name;    SELECT @total_distinct:=COUNT( DISTINCT lice_no)   #using ":=" noationsFROM table_name; SELECT @total - @total_distinct
Salin selepas log masuk
<strong>例2:</strong>
Salin selepas log masuk
DECLARE @register_count INT;DECLARE @total_count INT;SELECT     @register_count := COUNT(1) FROM    t1 WHERE id > 10 ;
Salin selepas log masuk
    SELECT     @total_count := COUNT(1) FROM    t1 ;    SELECT     (@register_count * @total_count) AS ratio2
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

DECLARE 与 SET 区别:

<ol>
<li>DECLARE 必须指定类型,而SET是不用的</li>
<li>SET定义的是用户自定义变量,是Session Sensitive 的; DECLARE 声明的变量一般为局部变量,其有效区间是声明的函数或存储过程中。</li>
<li>定义全局变量应该为 SET GLOBAL @var_name 后者SET @@GLOBAL.var_name</li>
</ol>
Salin selepas log masuk

注意及附录:

这里关于变量的使用范围要清楚。官方介绍网址: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan