MySql变量用法详解

自我介绍

我是IT果果日记
一个普通的技术宅,定期分享技术文章,欢迎点赞、关注和转发,请多关照。

MySql变量主要分为系统变量、用户变量和局部变量,它们的区别是什么?分别有什么作用呢?

下面会一一给大家讲解一下,并结合一个示例,演示怎么样运用MySql变量,查询一个父节点及它的所有子节点?

系统变量

  • 系统变量就是系统已经提前定义好的变量。

  • 按作用域分类,系统变量可以分为全局变量(global)和会话变量(session)。系统变量中全局变量和会话变量其实是使用一套变量,不同的是会话变量仅当次会话生效,而全局变量一直生效。

  • 会话变量的赋值:set 变量名 = 值; 【比如常用的set names ="utf8";】或者set @@变量名 = 值。

  • 全局变量的赋值:set global 变量名 = 值。

show命令查看系统变量

show variables;
show global variables;
show session variables;
show variables like '%version%';

上述命令分别表示查看当前系统的所有变量,查看所有的全局变量和查看所有的会话变量,以及模糊匹配version,查看当前系统变量。上述命令执行结果如下:

MySql变量用法详解_第1张图片

select命令查看系统变量

select @@default_storage_engine;
select @@global.default_storage_engine;
select @@session.default_storage_engine;

上述三条命令,都表示查看default_storage_engine变量,区别在于第二条指定查看的是全局变量,第三条指定查看的是会话变量,第一条并未指定,但是在会话变量和全局变量同时存在的情况下,默认显示的是会话变量。上述命令执行结果如下:

MySql变量用法详解_第2张图片

用户变量

  • 用户变量就是用户自己定义的变量。

  • 系统为了区别系统变量跟自定义变量,规定用户自定义变量必须使用一个@符号

  • 变量的定义方式:

set @变量名=值;
select @变量名:=值;
select 值 into @变量名;
  • 用户变量可以不声明定义,就可以直接使用,不过默认是null值

  • 用户变量都是会话级的变量,仅在当次连接中生效。

此外,赋值符号 := 和 = 的区别是:

= 只有在 set 和 update 时才和 := 一样有赋值的作用,其它都是等于的作用。

:= 不只在 set 和 update 时有赋值的作用,在 select 时也是赋值的作用。

select @user_variable := @user_variable + 1; 

上述 sql 给一个用户变量 user_variable 做了+1操作,所以select的结果是2。

MySql变量用法详解_第3张图片

局部变量

作用范围在 begin end 语句块之间,用 declare 语句定义的变量称为局部变量。当语句执行完毕,局部变量就消失了。

局部变量定义注意事项:必须在存储过程或函数中定义,且若不是在最开始定义的,则必须在begin end;(注意一定要加分号;)块中定义与使用。

MySql变量用法详解_第4张图片

查询一个父节点及其它的子节点

SELECT sm.menu_id, sm.menu_name, sm.parent_menu_id
FROM sys_menu sm,
	(
    	SELECT @pid := 
        (
    		SELECT GROUP_CONCAT( menu_id ) 
    		FROM sys_menu 
    		WHERE menu_name IN ( '活动管理', '积分中心' ) 
    		AND ( parent_menu_id IS NULL OR parent_menu_id = '' ) 
    	)
    ) pd 
WHERE FIND_IN_SET( sm.menu_id, @pid ) > 0 
UNION
SELECT au.menu_id, au.menu_name, au.parent_menu_id
FROM sys_menu au 
WHERE FIND_IN_SET( parent_menu_id, @pid ) > 0 
AND EXISTS ( SELECT @pid := concat( @pid, ',', menu_id ));

上述sql查询了两个一级菜单"活动管理"、"积分中心",以及它们下面的所有子菜单。sql由上下两部分组成,由sql关键字 union 分隔开。

  • union 上面的sql查询的是一级菜单。

用户变量 pid 被赋值为"活动管理"和"积分中心"的菜单id字符串,用 GROUP_CONCAT() 函数拼接成都逗号分隔的字符串。FIND_IN_SET(sm.menu_id, @pid) 在用户变量 pid 中搜索 sm.menu_id 的值,并返回序号(序号从1开始)

  • union 下面的sql查询的是两个一级菜单下的所有子菜单。

AND EXISTS ( SELECT @pid := concat( @pid, ',', menu_id ))

EXISTS 条件语句的作用是往用户变量 pid 后面追加子菜单id,这样就达到了向下遍历更深一级子菜单的效果。

最后的查询结果如下:

MySql变量用法详解_第5张图片

总结

  • 系统变量就是系统已经提前定义好了的变量。它可以分为全局变量(global)和会话变量(session)。

会话变量的赋值:set 变量名 = 值; 或者set @@变量名 = 值。
全局变量的赋值:set global 变量名 = 值。
  • 用户变量就是用户自己定义的变量。用户自定义变量必须使用一个@符号。

  • 用户变量的定义方式:

set @变量名=值;
select @变量名:=值;
select 值 into @变量名;
  • 作用范围在 begin end 语句块之间,用 declare 语句定义的变量称为局部变量

请联系我

我是IT果果日记
一个普通的技术宅,定期分享技术文章,欢迎点赞、关注和转发,请多关照。
MySql变量用法详解_第6张图片

https://gitee.com/chenzhaoplus

https://github.com/chenzhaoplus

https://blog.csdn.net/cz285933169?spm=1010.2135.3001.5421

你可能感兴趣的:(mysql,sql)