13 mysql变量、流程控制if和while
变量
mysql本质是一种编程语言,需要很多变量来保存数据
mysql中的属性控制都是通过mysql变量实现的
系统变量
系统变量:系统内部定义的变量,针对所有用户和客户端都有效
-- 查看所有系统变量
show VARIABLES;
-- 查看系统变量autocommit的值:需要知道具体的系统变量的名称
SELECT @@autocommit;
-- 查看系统变量auto_increment_increment的值
SELECT @@auto_increment_increment;
-- 合并查看 auto_increment_increment和autocommit 的值
SELECT @@auto_increment_increment,@@autocommit;
-- 查看 某些 系统变量
show VARIABLES like '%sql_mode%';
-- mysql的版本 和 sql_mode的值
select version(), @@sql_mode;
修改系统变量
1. 局部修改
只针对当前客户端、当前连接有效
-- 语法:
set 变量名 = 新值
-- 设置group by 分组警告:重启后失效,需要重新设置
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
2. 全局修改
针对所有客户端,但是如果重启mysql失效
--语法:
set global 变量名 = 新值;
-- 或者
set @@global.变量名 = 值;
-- 设置group by 分组警告:重启后依然失效,需要重新设置
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
会话变量-用户变量
也称为 用户变量,会话变量跟mysql客户端是绑定的,设置的变量只针对当前用户使用的客户端生效
-- 语法
set @变量名 = 值;
-- 定义一个会话变量
set @msg='hello world';
SELECT @msg; -- 查看定义的会话变量
注意:因为在mysql中没有比较符号 ==,所以是使用=代替了比较符号,所以有的时候在赋值的时候再使用=进行赋值,就会报错,mysql为了避免系统分不清是赋值还是比较,就特定新增了一个变量的赋值符号 :=
-- 语法--推荐
set @变量名 := 新值;
-- 使用专有赋值符号 进行赋值
set @name2 := 'hello world2';
SELECT @name2;
mysql是专门存储数据的:所以它是允许将数据从数据表中取出存储到变量中的,但是查询到的数据必须只能是一行数据
-- 语法:
-- 1. 赋值且查看赋值过程,赋值使用 :=,否则不起作用
select @变量名1:=字段1,@变量名2:=字段2 from 数据表 where 条件;
SELECT @cid:=id,@cname:=name from student LIMIT 1;
SELECT @cid,@cname;
-- 只赋值,不看赋值过程
select 字段1,字段2 from 数据表 where 条件 into @变量1,@变量2;
SELECT id,name from student WHERE id=1 into @ccid,@ccname;
SELECT @ccid,@ccname;
查看变量的值
select @变量名;
局部变量declare
作用在begin和end语句块之间的变量,使用declare声明
begin和end主要是在大型语句块中使用,比如 函数、存储过程、触发器
-- 语法
declare 变量名 数据类型 [属性];
-- 定义变量并设置默认值
declare num int default 10;
-- 给变量加1
set num=num+1;
declare num int default 0;
-- 将查询数量出的数值赋值num
SELECT count(*) into num from student;
变量作用越
变量能够使用的区域范围
局部作用域
使用declare关键字声明的变量,只能在结构体(函数、存储过程、触发器)内部使用
会话作用域
用户使用 @ 符号定义的变量,也称为用户变量
作用域:在当前用户当次连接有效,只要是本连接中,任何地方都可以使用(可以在结构体内部或整库中)
全局作用域
所有客户端、所有连接都有效,需要使用全局标记定义变量
set global 变量名 = 值;
set @@global.变量名=值
mysql流程控制:if和while
if条件判断
1. 基本语法
if分支在mysql中的基本语法主要有2种:
1、 用在select查询中,当做一种条件进行判断
-- 语法
if(条件,为true结果,为false结果);
-- 将成绩>80的划分为及格
SELECT *,if(score>80,'及格','不及格') 是否及格 from student;
2、 用在复杂的语句块中(函数、存储过程、触发器)
if 条件表达式 then
满足条件要执行的语句
end if;
2. 复合语法
if 条件表达式 then
满足条件要执行的语句
else
不满足条件要执行的语句;
-- 如果还有其他细分的分支,还可以继续嵌套 if esle
end if;
while循环
一般是用在 复杂的语句块中(函数、存储过程、触发器)
-- 语法
while 条件 do
要循环执行的代码;
end while;
结构标识符
结构标识符:为某些特定的结构进行命名,主要是为了在循环体中控制循环
在mysql中,主要是使用 iterate和leave来控制循环
iterate:迭代,就是以下的代码继续执行,重新开始新的循环,类似continue
leave:离开,终止整个循环,类似break
标识符名称:while 条件 do
if 条件判断 then
循环控制
iterate/leave 标识符名称;
end if;
end while[标识符名称];