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,查看当前系统变量。上述命令执行结果如下:
select命令查看系统变量
select @@default_storage_engine;select @@global.default_storage_engine;select @@session.default_storage_engine;
上述三条命令,都表示查看default_storage_engine变量,区别在于第二条指定查看的是全局变量,第三条指定查看的是会话变量,第一条并未指定,但是在会话变量和全局变量同时存在的情况下,默认显示的是会话变量。上述命令执行结果如下:
用户变量
用户变量就是用户自己定义的变量。
系统为了区别系统变量跟自定义变量,规定用户自定义变量必须使用一个@符号
变量的定义方式:
set @变量名=值;select @变量名:=值;select 值 into @变量名;
用户变量可以不声明定义,就可以直接使用,不过默认是null值
用户变量都是会话级的变量,仅在当次连接中生效。
此外,赋值符号 := 和 = 的区别是:
= 只有在 set 和 update 时才和 := 一样有赋值的作用,其它都是等于的作用。
:= 不只在 set 和 update 时有赋值的作用,在 select 时也是赋值的作用。
select @user_variable := @user_variable + 1;
上述 sql 给一个用户变量 user_variable 做了+1操作,所以select的结果是2。
局部变量
作用范围在 begin 到 end 语句块之间,用 declare 语句定义的变量称为局部变量。当语句执行完毕,局部变量就消失了。
局部变量定义注意事项:必须在存储过程或函数中定义,且若不是在最开始定义的,则必须在begin end;(注意一定要加分号;)块中定义与使用。
查询一个父节点及其它的子节点
SELECT sm.menu_id, sm.menu_name, sm.parent_menu_idFROM 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 UNIONSELECT au.menu_id, au.menu_name, au.parent_menu_idFROM 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,这样就达到了向下遍历更深一级子菜单的效果。
最后的查询结果如下:
总结
系统变量就是系统已经提前定义好了的变量。它可以分为全局变量(global)和会话变量(session)。
会话变量的赋值:set 变量名 = 值; 或者set @@变量名 = 值。全局变量的赋值:set global 变量名 = 值。
用户变量就是用户自己定义的变量。用户自定义变量必须使用一个@符号。
用户变量的定义方式:
set @变量名=值;select @变量名:=值;select 值 into @变量名;
作用范围在 begin 到 end 语句块之间,用 declare 语句定义的变量称为局部变量。
请联系我
我是IT果果日记
一个普通的技术宅,定期分享技术文章,欢迎点赞、关注和转发,请多关照。
https://gitee.com/chenzhaoplus
https://github.com/chenzhaoplus
https://blog.csdn.net/cz285933169?spm=1010.2135.3001.5421
来源地址:https://blog.csdn.net/cz285933169/article/details/128962282
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341