### 前置使用@与@@
### @是用户变量
mysql> set a=100;
ERROR 1193 (HY000): Unknown system variable 'a'
mysql> set @a=100;
Query OK, 0 rows affected (0.00 sec)
mysql> select @a from dual;
+------+
| @a |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
### @@是系统变量
查看全部系统变量指令
show global variables;
查看单个系统变量
show global variables like 'wait_timeout'
设置系统变量语法
SET GLOBAL wait_timeout = 604800;
获取系统变量值的语法
select @@wait_timeout from dual;
@变量名 : 定义一个用户变量.
= 对该用户变量进行赋值.
用户变量赋值有两种方式: 一种是直接用"="号,另一种是用":="号。
###其区别在于:
###使用set命令对用户变量进行赋值时,两种方式都可以使用;
###用select语句时,只能用”:=“方式,因为select语句中,”="号被看作是比较操作符。
mysql存储过程中,定义变量有两种方式:
###使用set或select直接赋值,变量名以 @ 开头.
例如:set @var=1;
可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量。
###以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:
DECLARE var1 INT DEFAULT 0;
主要用在存储过程中,或者是给存储传参数中。
###两者的区别是:
在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量。
### 自定义函数
mysql> create function fun(name varchar(20))
-> returns varchar(50)
-> begin
-> declare str varchar(50) default '';
-> set @tablename=name;
-> set str=concat('create table ',@tablename,'(id int,name varchar(20));');
-> return str;
-> end&&
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> select fun("mytable");
+------------------------------------------------+
| fun("mytable") |
+------------------------------------------------+
| create table mytable(id int,name varchar(20)); |
+------------------------------------------------+
1 row in set (0.00 sec)