变量mysql变量可分为两大类,即系统变量和用户变量。
但根据实际应用又被细化为四种类型局部变量用户变量会话变量全局变量
用户变量mysql用户变量,mysql中用户变量不用提前申明,在用的时候直接用“@变量名”使用就可以了,其作用域为当前连接。
第一种用法,使用set时可以用“=”或“:=”两种赋值符号赋值 set @age=19; set @age:=20;
第二种用法,使用select时必须用“:=”赋值符号赋值SELECT @name:=NAME FROM student WHERE stuid = 101
会话变量mysql会话变量,服务器为每个连接的客户端维护一系列会话变量,其作用域仅限于当前连接,即每个连接中的会话变量是独立的。
常用操作-- 显示所有的会话变量 show session variables; show session variables like '%auto%'; -- 修改会话变量 set @@session.autocommit = 1 -- 查看会话变量 select @@session.autocommit
全局变量
mysql全局变量,全局变量影响服务器整体操作,当服务启动时,它将所有全局变量初始化为默认值。要想更改全局变量,必须具有super权限。其作用域为server的整个生命周期。
-- 显示所有的全局变量
show global variables;
show global variables like '%autocommit%';
-- 设置全局变量的值
set @@global.autocommit=0;
-- 查看全局变量值
select @@global.autocommit;
局部变量
mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块,其作用域仅限于该语句块。
- 声明语法:DECLARE var_name [, var_name]... data_type [ DEFAULT value ]; - var_name为局部变量的名称; - DEFAULT value子句指定指定变量的默认值
DECLARE id INT;--仅声明一个变量
DECLARE age INT DEFAULT 18; --声明int类型的age,值为18
DECLARE nation,city varchar(50);--声明两个变量
DECLARE weixin,qq varchar(20) default '123456';--声明两个变量值为123456
- 赋值方式: - 语法1:SET var_name=expr [, var_name=expr]...;
DECLARE var1, var2, var3 INT;
SET var1=10, var2=20;
SET var3=var1+var2;
- 语法2:SELECT INTO为变量赋值
DECLARE v_name varchar(20);
DECLARE v_gold int;
select name,gold into v_name, v_gold from student where stuid= 101;
select v_name, v_gold;
流程控制类似三元表达式写法
BEGIN
DECLARE v_pjf int;
select avg(score) into v_pjf from score where stuid=101;
select (if(v_pjf>60,'及格','不及格'));
ENDIF一个分支 BEGIN DECLARE pjf int; select avg(score) into pjf from score where stuid=101; IF pjf>60 THEN select '优秀'; END IF; END
- IF两个分支
BEGIN
\#Routine body goes here...
DECLARE v_sex bit;
DECLARE v_msg varchar(50);
select sex into v_sex from student where stuid=101;
IF v_sex=1 THEN
set v_msg='这是男生';
else
set v_msg='这是女生';
END IF;
select v_msg;
END
- IF多个分支
BEGIN
DECLARE v_gold int;
select gold into v_gold from student where stuid = 101;
IF v_gold>10000 THEN
select '土豪';
elseif v_gold>50000 then
select '有钱';
else
select '还行';
END if;
END
- CASE语句
BEGIN
DECLARE v_gold int;
select gold into v_gold from student where stuid = 101;
case when v_gold>10000 then
select '土豪';
when v_gold>50000 then
select '有钱';
else
select '还行';
end case;
END
#### 循环 #### - LOOP循环 语法:
label: LOOP
statement_list
IF exit_condition THEN
LEAVE label;
END IF;
END LOOP label;
- 例子:
BEGIN
DECLARE i int default 100;
label: LOOP
select * from student where stuid=i;
set i = i+1;
IF i>105 THEN
LEAVE label;
END IF;
END LOOP label;
END
- WHILE循环,满足条件时执行循环体(先检查条件是否满足再进行操作) - 语法
WHILE search_condition DO
statement_list
END WHILE;
- 例子
BEGIN
\#Routine body goes here...
DECLARE s int;
DECLARE i int;
set s=0,i=1;
WHILE i<=100 DO
set s=s+i;
set i=i+1;
END WHILE;
SELECT s;
END
- REPEAT循环,满足条件时跳出循环(执行操作后检查条件是否满足)
- 语法:
REPEAT
statement_list
UNTIL search_condition
END REPEAT;
- 例子:
BEGIN
DECLARE s int;
DECLARE i int;
set s=0,i=1;
REPEAT
set s=s+i;
set i=i+1;
UNTIL i>100
END REPEAT;
SELECT s;
END
作业
- 编写程序- 1.声明3个用户变量,都是int,定义第四个用户变量,求和,第四个变量的结果,修改一下会话变量,修改一下自动提交为0,然后在改回来 - 2.创建过程,查询姓张的同学数量。如果少于5个就insert一个张三同学 - 3.统计有多少个同学有成绩,如果超过30个,输出所有同学已经考过了,否则就输入,还有xx人没有考试 - 4.查询一下某人的总分,如果小于100分就拖出去打死,小于140分就拖出去喂狗,小于160就拖出去阉了,其他情况就砍掉一只手 - 5.求和:2 + 4 +8 +16 + ... + 1024; - 6.创建一张表,id和phone,向表里面插入100000行数据。
想知道作业正确答案的初学者可以私信我“用户变量答案”