mysql中的系统变量、自定义变量

一、系统变量:

1.说明

系统变量是mysql系统提供的,非用户定义的变量,它可以分为全局变量和会话变量

  • 全局变量:用global关键字标识,在所有会话(连接)中均有效
  • 会话变量:用session关键字标识,只对当前会话(连接)有效

2.查看系统变量

  • 查看所有全局变量SHOW GLOBAL VARIABLES;
  • 查看所有会话变量SHOW SESSION VARIABLES; session关键字可省略,如SHOW VARIABLES; 缺省session默认查询当前会话变量。
    下文中将以 | 符号表示或者,以 [] 表示省略,则查看系统变量公式为:
 	SHOW GLOBAL|[SESSION] VARIABLES;
  • 查看指定的系统变量
	# %表示匹配任意字符,可选择性使用。
	SHOW GLOBAL|[SESSION] VARIABLES LIKE '%系统变量名%';   

例如:查看常用的全局系统变量,字符集:SHOW GLOBAL VARIABLES LIKE '%char%'; 事务自动提交:SHOW GLOBAL VARIABLES LIKE 'autocommit'; 事务隔离级别:SHOW GLOBAL VARIABLES LIKE 'tx_isolation'; (如果查询当前会话变量值,将关键字GLOBAL省略或替换成SESSION)。

  • 查看系统变量值
	SELECT @@GLOBAL|[SESSION].系统变量名;

例如:查询mysql全局默认存储引擎:SELECT @@GLOBAL.default_storage_engine; 查询mysql当前会话默认存储引擎:SELECT @@SESSION.default_storage_engine;(SESSION关键字可省略)。

3.修改系统变量

  • 方式一:
	SET GLOBAL|[SESSION] 系统变量名= 值;
  • 方式二:
	SET @@GLOBAL|[SESSION].系统变量名= 值;

例如:关闭事务自动提交:SET SESSION autocommit = 0; 或者SET @@SESSION.autocommit = 0; (1表示开启ON,0表示关闭OFF)。

特别注意: 修改全局系统变量值可以跨连接,不能跨重启 ,也就是说修改全局变量后,对之后的每个会话(连接)都有效,而mysql服务器重启后,值将失效,系统变量将重新使用默认值。(想修改后永久生效,可以直接改配置文件,这个不在本文阐述)

小tips:一般我们修改当前会话系统变量,均习惯省略关键字SESSION,但在某些情况下(如使用cmd命令行修改事务隔离级别),缺省关键字修改变量,值不会马上更新。所以一般修改时建议带上关键字。

二、自定义变量

1.说明

自定义变量为非系统提供的,用户自定义的变量。它可以分为用户变量和局部变量

  • 用户变量:可以定义在任何位置(begin end里面或外面都可以),在当前会话(连接)中有效,在使用中必须使用@,定义变量时不需要类型
  • 局部变量:仅仅在定义它的begin end(用于存储过程或函数)中有效,一般不需要使用@,定义变量必须要加类型

2.自定义变量的使用

用户变量:

(1)声明及初始化

	SET @用户变量名= 变量值;
	SET @用户变量名 := 变量值'
	SELECT @用户变量名 := 变量值;

赋值符号有=和:=两种SET可以与任意一种搭配,SELECT只能搭配:=定义变量不需要指定具体类型(类似js中 var 变量 = 值),例如:

	# 字符型
	SET @name = 'xy'; 
	# 数值型
	SET @name := 123;
	# 浮点型
	SELECT @name :=12.3;

均可以。

(2)赋值(更新值)

  • 方式一:使用(1)中声明及初始化的语句
	SET @用户变量名= 变量值;
	SET @用户变量名 := 变量值'
	SELECT @用户变量名 := 变量值;
  • 方式二:使用SELECT INTO
 	SELECT
		字段1,字段2...  INTO @用户变量名1,@用户变量名2....
	FROM
		表;

select into可以一次性赋值多个用户变量,以英文逗号,隔开即可,注意每个字段查询结果只能为一个值(一行一列),无法将多个值赋给一个用户变量。当然,可以使用查询的任意合法值进行赋值,如count(*)、max(fd_age)/min(fd_age)、常量等。
例如:将basic_user表的统计结果赋值给变量@result

	SELECT
		count(*) INTO @result
	FROM
		basic_user;

(3)使用用户变量:

	SELECT @用户变量名称;

你也可以使用变量做逻辑运算、逻辑比较
例如:仍然使用上面的@result变量,我们可以

# 判断是否变量值是否等于1,结果将返回1(true)或者0(false),注意mysql的等于只用一个=符号
SELECT @result=1;

# 返回两倍变量值
SELECT @result*2;
局部变量:

(1)声明

	DECLARE 变量名 类型;
	DECLARE 变量名 类型 DEFAULT 值;

(2)赋值(更新值)
局部变量赋值与用户变量赋值方式一致

  • 方式一:使用(1)中声明及初始化的语句
	SET 局部变量名= 变量值;
	SET 局部变量名 := 变量值'
	SELECT @局部变量名 := 变量值;  # 使用select赋值需要带上@
  • 方式二:使用SELECT INTO
 	SELECT
		字段1,字段2...  INTO 局部变量名1,局部变量名2....
	FROM
		表;

(3)使用局部变量:

	SELECT 局部变量名称;

局部变量只能在begin…end使用,例如:创建存储过程,判断用户表basic_user中是否有某个用户。
使用管理员方式打开cmd,连接数据库 mysql -uroot -proot123,使用对应数据库 use xytest; 创建如下存储过程

	DELIMITER $ # 将语句结束符号分号;改为$
	CREATE PROCEDURE myp1(IN username VARCHAR(20)) 
	BEGIN
			DECLARE result INT DEFAULT 0;  # 定义局部变量result
	
			SELECT
				count(*) INTO result  # 给局部变量赋值
			FROM
				basic_user
			WHERE
				fd_name = username;
	
			SELECT IF(result>0,'存在','不存在');   # 使用局部变量的值进行判断
	END $

调用存储过程:

	CALL myp1('xy')$    # 使用存储过程

输出结果:
在这里插入图片描述
文中如有不正确观点,敬请指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值