存储过程:数据库里的 "定制工具箱"
存储过程就像一个装满工具的箱子,你需要什么功能,就调用对应的工具。它是用 SQL 语句写好的一段程序,存储在数据库里,随时可以调用。
创建存储过程 就像在工具箱里放新工具。比如,我们创建一个计算学生总分的存储过程:
delimiter //
create procedure p_calAvg()
BEGINselect name, chinese + math + english as total from exam;
END //
delimiter ;
delimiter //
是在告诉数据库,我们暂时不用普通的分号;
结束语句,而是用//
,这样就能完整地创建存储过程啦!创建完成后别忘了用delimiter ;
把分号变回来哦。
调用存储过程 就像从工具箱里拿出工具用:
call p_calAvg();
存储过程能减少网络传输,提高性能,就像把常用工具放在手边,随用随取。
变量:数据库里的 "小纸条"
在 MySQL 里,变量就像小纸条,把数据暂时记在上面,之后再用。
系统变量:数据库自带的 "便签"
系统变量是数据库自己准备好的便签,分为全局(所有用户都能看)和会话(只给自己看)两种:
查看系统变量:
SHOW VARIABLES LIKE 'character_set_server';
设置系统变量:
SET GLOBAL character_set_server = 'utf8mb4';
用户自定义变量:你的专属 "记事本"
你可以自己创建变量来保存临时数据:
SET @var_name = 123; -- 赋值
SELECT @var_name; -- 使用
局部变量:存储过程里的 "便签条"
在存储过程里,变量只能在过程里用,像这样:
DECLARE var_name INT DEFAULT 0;
变量能帮你保存中间结果,方便后续操作,就像做数学题时先把步骤记下来,最后再算出答案。
SQL 编程:让数据库学会 "思考"
SQL 也能像编程一样,根据条件做不同操作,甚至循环执行,就像给数据库装上了 "聪明大脑"。
条件语句:数据库的 "选择题"
IF 语句 就像给数据库出选择题:
IF score >= 90 THENSET grade = 'A';
ELSEIF score >= 60 THENSET grade = 'B';
ELSESET grade = 'C';
END IF;
CASE 语句 像更灵活的选择题,有两种写法:
简单 CASE:
CASE var_name WHEN 1 THEN 'A' WHEN 2 THEN 'B' ELSE 'C' END
搜索结果 CASE:
CASE WHEN score >= 90 THEN 'A' WHEN score >= 60 THEN 'B' ELSE 'C' END
循环语句:数据库的 "重复播放"
WHILE 循环 像设置个条件,满足就一直执行:
WHILE i <= 10 DOSET sum = sum + i;SET i = i + 1;
END WHILE;
REPEAT 循环 则是先执行,再判断是否继续:
SET i = 0;
REPEATSET sum = sum + i;SET i = i + 1;
UNTIL i > 10
END REPEAT;
LOOP 循环 像个简单的重复播放,配合 LEAVE(跳出循环)和 ITERATE(继续循环):
outer_loop: LOOPINNER LOOP: LOOPIF i > 5 THENLEAVE outer_loop;END IF;SET i = i + 1;ITERATE INNER LOOP;END LOOP;
END LOOP;
游标:数据的 "快递员"
游标能把查询结果一行行地送过来,方便你逐个处理:
声明游标:
DECLARE cursor_name CURSOR FOR select...
打开游标:
OPEN cursor_name;
获取数据:
FETCH cursor_name INTO var_name1, var_name2;
关闭游标:
CLOSE cursor_name;
条件处理程序:数据库的 "安全员"
条件处理程序能帮数据库应对各种异常情况,就像给它配了个安全员:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONSET error_count = error_count + 1;
存储函数:数据库的 "小助手"
存储函数就像数据库的小助手,能返回计算结果:
CREATE FUNCTION Fun(n INT) RETURNS INT DETERMINISTIC
BEGINDECLARE total INT DEFAULT 0;WHILE n > 0 DOSET total = total + n;SET n = n - 1;END WHILE;RETURN total;
END
调用时直接用 SELECT Fun(10);
就能拿到结果啦!