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;

image

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[标识符名称];

posted @ 2024-07-15 16:14  songxia777  阅读(13)  评论(0编辑  收藏  举报