当前位置: 首页 > news >正文

mysql编程--从入门到入土

    • 创建存储过程
    • 调用存储过程
    • 删除存储过程
    • 可能出现的问题
    • MySQL变量
      • 系统变量
    • 定义变量
    • 查询变量
    • 变量的简单使用
    • 局部变量
    • if语句
    • 参数
    • case语句
    • while语句
    • repeat循环
    • cursor游标
    • 触发器(trigger)
    • 触发器关键字(old/new)

创建存储过程

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 thenset result = '高收入';elseif sal>5000 thenset result = '中等收入';elseset 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 thenset result = '高收入';elseif sal>5000 thenset result = '中等收入';elseset result = '低收入';end if;select result;
end# 调用存储过程call sal(7000,@result); -- 在sal数据处写入值,运行存储过程,因为我们没有输出语句此时没有任何内容被输出#查询我们曾赋值的result,输出结果select @result
create procedure p1(inout sal int) #此时定义inout即是入参又是出参
beginset 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也可以使用elseelse 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;		#结束ifset 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)
beginset sum=0;repeat#这里直接搬上面的代码了if n%2=0 then	#此时嵌套一个if判断能被二整除的数set sum=sum+n;	#如果n能被2整除则改数字为偶数end if;		#结束ifset 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 pbefore/after insert/update/delete on 表名  -- 在插入数据前(后)执行触发器for each row -- 每次添加数据后都执行一次begin-- 触发器语句end

实例讲解

create trigger pafter insert on `user`for each rowbegin-- 当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

相关文章:

  • PPT的精细化优化与提升策略
  • Kubernetes中的Java微服务部署策略
  • 【深度学习】python之人工智能应用篇——图像生成技术(一)
  • 大数据面试-Hive
  • 用Java获取键盘输入数的个十百位数
  • 线代的学习(矩阵)
  • c语言回顾-结构体(2)
  • C++设计模式之适配器模式
  • Ubuntu配置ssh+vnc(完整版)
  • 数据结构:为什么说链表是顺序表的升级版(c语言实现)
  • pgsql给单独数据库制定账号权限
  • Kotlin 中的内联函数
  • AI与音乐:共创未来乐章还是终结艺术的颂歌?
  • Docker容器导出导入
  • Python发送Email的性能怎么样?如何配置?
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Babel配置的不完全指南
  • crontab执行失败的多种原因
  • express如何解决request entity too large问题
  • Java-详解HashMap
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 人脸识别最新开发经验demo
  • 学习JavaScript数据结构与算法 — 树
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 自动记录MySQL慢查询快照脚本
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #if #elif #endif
  • #if等命令的学习
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (zt)最盛行的警世狂言(爆笑)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)视频码率,帧率和分辨率的联系与区别
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ./configure,make,make install的作用
  • .gitignore文件_Git:.gitignore
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Core中的时区转换问题
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net实现头像缩放截取功能 -----转载自accp教程网