mysql编程--从入门到入土

创建存储过程

create procedure p()
begin
select * from emp;
end;

调用存储过程

call p;

删除存储过程

drop procedure if exists p;

可能出现的问题

在dos命令窗口时,遇到分号则会执行语句。解决办法:运行下方语句,服务器不再会遇到分号结尾了,而是两个斜杠
delimiter// – 告诉服务器,遇到两个斜杠再执行sql语句

MySQL变量

系统变量

系统变量由系统提供,不是用户定义的,属于服务器层面

查看系统变量

show global variables; -- 全局的
show session variables;-- 当前会话的(当前连接)

设置系统变量

set [global I session] 系统变量名 =;

注意:当MySQL服务重启后,之前的配置会失效

定义变量

set @name = '张三';
定义一个变量name,值为张三

查询变量

select @name;
-- 查询多个变量
select @name,@age,@sex,@information;
注:如果没有声明变量直接查询的话结果为null

变量的简单使用

-- 我们也可以在查询中调用变量
select * from student where ename=@name;
-- 同时也可以将查询结果赋值给变量
select age into @age from student where ename='张三';

局部变量

在存储过程中可以使用变量,使用declare声明,只在begin和end之间有效
CREATE DEFINER=`root`@`localhost` PROCEDURE `pee`()
BEGIN
-- 声明两个变量
	declare age int default 0;
-- 为变量赋值
	set age =18;
END

if语句

语法格式:

if 条件 then
	...
else if 条件 then
	...
else if 条件 then
	...
else
	...
end if

实战练习:
通过工资来判断收入群体,sal超过10000的为高收入群体,5000以上为中等收入群体,5000一下 为低收入群体

CREATE PROCEDURE p()
begin 
  declare sal int default 0;
	declare result varchar(20);
	set sal := 5001;
	if sal>10000 then
		set result = '高收入';
	elseif sal>5000 then
		set result = '中等收入';
	else
		set result = '低收入';
	end if;
	select result;
end

参数

in:入参(未指定时,默认入参)写入数据但并不导出
out:出参 不写入数据,输出参数
inout:既入参又出参

CREATE PROCEDURE sal(in sal int,out result varchar(20))
# 此处我们定义了一个sal(工资),result输出结果,这两个变量均欸局部变量,在存储过程外只能访问到用户变量,但result作为一个输出结果,在存储过程外我们是能查到的
begin 
# 我们在创建存储过程时已经定义了sal,此时我们无需再定义值
	if sal>10000 then
		set result = '高收入';
	elseif sal>5000 then
		set result = '中等收入';
	else
		set result = '低收入';
	end if;
	select result;
end
 # 调用存储过程
 call sal(7000,@result); -- 在sal数据处写入值,运行存储过程,因为我们没有输出语句此时没有任何内容被输出
 #查询我们曾赋值的result,输出结果
 select @result
create procedure p1(inout sal int) #此时定义inout即是入参又是出参
begin
	set sal=sal*1.1;
end;

set @sal=10000;  #定义sal,此时的sal与上方的sal无关,只是一个赋值的变量,所以变量名随意,下方同理,但要与这行定义的函数相匹配
call p1(@sal);   #给存储过程赋值,输出结果会直接赋值到sal变量上
select @sal; 	 #查询变量

case语句

create procedure p2(in `month` int,out season varchar(20))
begin
#case第一种语法格式
	case `month`
	# 当month值匹配到下方的值,则执行sql语句,相当于编程中的switch语句
--		when 值1 then sql语句
--		when 值2 then sql语句
--		when 值3 then sql语句
--		when 值4 then sql语句
		#例
		when 3 then set season='春季';
		#与if相同,case也可以使用else
		else set season='非法月份';
		# 当month=3时,season值为春季作为输出值
	end case;
end;

call p2(3,@season);
select @season;

while语句

drop procedure if exists p3;
create procedure p3(in n int,out sum int)
begin
-- 	while 条件 do ## 当条件为真的时候执行循环
-- 		循环体
-- 	end while;
		set sum=0;
		while n>0 do  #如果n大于0则执行下方语句
		
			if n%2=0 then	#此时嵌套一个if判断能被二整除的数
				set sum=sum+n;	#如果n能被2整除则改数字为偶数
			end if;		#结束if
			set n = n-1;	#迭代器,如果n没有变化,则while为死循环
		end while;	#结束循环
end;

call p3(100,@sum);
select @sum;

repeat循环

,先执行sql语句,再判断,当until里符合条件时结束循环,所以无论until语句是否符合条件,语句必执行一次

drop procedure if exists p3;
create procedure p3(in n int,out sum int)
begin
	set sum=0;
	repeat
			#这里直接搬上面的代码了
			if n%2=0 then	#此时嵌套一个if判断能被二整除的数
				set sum=sum+n;	#如果n能被2整除则改数字为偶数
			end if;		#结束if
			set n = n-1;	#迭代器,如果n没有变化,则while为死循环
			until n<=0  #注意这里不加分号
		end repeat;
end;

call p3(100,@sum);
select @sum;

cursor游标

在 MySQL 中,游标(Cursor)是一种数据库对象,用于逐行处理查询结果集。游标允许你在一个块中处理大型结果集,而不是一次性将整个结果集加载到内存中,这对于处理大量数据非常有用。
使用游标通常涉及以下几个步骤:

1.声明游标:定义游标并指定要检索的结果集。
2.打开游标:准备游标以供使用。
3.提取数据:使用 FETCH 语句从游标中逐行检索数据。
4.关闭游标:完成数据处理后,关闭游标以释放资源。
声明游标

declare 游标名 cursor for 查询语句;

打开游标

open 游标名

通过游标取数据

fetch 游标名 into [变量,变量,变量…]

关闭游标

close 游标名;

触发器(trigger)

MySQL触发器(Trigger)是一种特殊的存储过程,它在数据库中指定的事件发生时自动执行。这些事件可以是数据的插入、更新、删除操作。常用于自动执行,当我在主表中添加数据,我可以通过触发器在从表中同步添加数据。也可以做一些限制,例如修改价格浮动不超过10%。

create trigger p
	before/after insert/update/delete on 表名  -- 在插入数据前(后)执行触发器
	for each row -- 每次添加数据后都执行一次
	begin
		-- 触发器语句
	end

实例讲解

create trigger p
	after insert on `user`
	for each row
	begin
		-- 当user表有任何插入语句被执行,则执行触发器,在从表user_wallet同步添加语句
		-- 其中user_wallet.user_id为user表主键的外键
		insert into user_wallet (user_id,balance) values(user_id=new.user_id,0.00);
	end

触发器关键字(old/new)

NEW:在发INSERT或UPDATE操作明间,NEW用于引用将要插入或更新到表中的新行的值。
OLD:在触发UPDATE或DELETE操作期间,OLD用于引用更新或除之前在表中的I旧行的值。
换句话说,在触发器被触发之前,表中本来有的数据为old数据,表中没有的则为new。上方实例中在user中插入语句之前并没有相关数据,则用new

  • 36
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值