mysql全局变量,全局变量影响服务器整体操作,当服务启动时,它将所有全局变量初始化为默认值。要想更改全局变量,必须具有super权限。其作用域为server的整个生命周期。 mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块,其作用域仅限于该语句块。 - 声明语法:DECLARE var_name [, var_name]... data_type [ DEFAULT value ]; - var_name为局部变量的名称; - DEFAULT value子句指定指定变量的默认值 - 赋值方式: - 语法1:SET var_name=expr [, var_name=expr]...; - 语法2:SELECT INTO为变量赋值 - IF两个分支 - IF多个分支 - CASE语句 #### 循环 #### - LOOP循环 语法: - 例子: - WHILE循环,满足条件时执行循环体(先检查条件是否满足再进行操作) - 语法 - 例子 - REPEAT循坏,满足条件时跳出循环(执行操作后检查条件是否满足) - 语法: - 例子: -- 1.声明3个用户变量,都是int,定义第四个用户变量,求和,第四个变量的结果,修改一下会话变量,修改一下自动提交为0,然后在改回来 -- 2.创建过程,查询姓张的同学数量。如果少于5个就insert一个张三同学 DELIMITER $ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `zy`.`demo2`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN DECLARE i INT; SELECT COUNT(*) INTO i FROM student WHERE NAME LIKE '张%'; SELECT i; IF i<5 THEN INSERT INTO student(NAME,phone,sex,age,addr,gold,birth) VALUES('张三',11365678810,1,18,'湖南',700,'2001-6-5'); END IF; SELECT i; END$ DELIMITER ; -- 3.统计有多少个同学有成绩,如果超过30个,输出所有同学已经考过了,否则就输入,还有xx人没有考试 DELIMITER $ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `zy`.`demo3`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN DECLARE i INT; SELECT COUNT(*) INTO i FROM score WHERE score IS NOT NULL; SELECT(IF(i>30,'已经考过了','还有人没有考试')); END$ DELIMITER ; -- 4.查询一下某人的总分,如果小于100分就拖出去打死,小于140分就拖出去喂狗,小于160就拖出去阉了,其他情况就砍掉一只手 DELIMITER $ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `zy`.`demo4`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN DECLARE i INT; SELECT SUM(score) INTO i FROM score WHERE stuid=101; IF i<100 THEN SELECT '拖出去打死'; ELSEIF i<140 THEN SELECT '拖出去喂狗'; ELSEIF i<160 THEN SELECT '拖出去阉了'; ELSE SELECT '砍掉一只手'; END IF; END$ DELIMITER ; -- 5.求和:2 + 4 +8 +16 + ... + 1024; DELIMITER $ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `zy`.`demo5`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN -- 求和:2 + 4 +8 +16 + ... + 1024 DECLARE i INT DEFAULT 2; DECLARE he INT DEFAULT 0; REPEAT SET he=he+i; SET i=i*2; UNTIL i>1024 END REPEAT; SELECT he AS he; END$ DELIMITER ; -- 6.创建一张表,id和phone,向表里面插入100000行数据。 DELIMITER $ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `zy`.`demo6`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN -- 创建一张表,id和phone,向表里面插入100000行数据 DECLARE a INT DEFAULT 1; lable:LOOP INSERT INTO zuoye VALUES(NULL,12345678910); SET a=a+1; IF a=1001 THEN LEAVE lable; END IF; END LOOP lable; END$ DELIMITER ;变量
用户变量
会话变量
全局变量
-- 显示所有的全局变量
show global variables;
show global variables like '%autocommit%';
-- 设置全局变量的值
set @@global.autocommit=0;
-- 查看全局变量值
select @@global.autocommit;
局部变量
DECLARE id INT;--仅声明一个变量
DECLARE age INT DEFAULT 18; --声明int类型的age,值为18
DECLARE nation,city varchar(50);--声明两个变量
DECLARE weixin,qq varchar(20) default '123456';--声明两个变量值为123456
DECLARE var1, var2, var3 INT;
SET var1=10, var2=20;
SET var3=var1+var2;
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,'及格','不及格'));
END
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
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
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
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 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
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行数据。