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

MySQL高级进阶(流程控制、循环语句、触发器)

一、流程控制语句

1.条件语句

IF语句:在函数或存储过程中使用
语法:

IF 条件 THEN
语句;[ELSEIF 条件2 THEN
语句2;ELSE 语句n;]END IF;

2.循环语句

用于函数和存储过程中

  1. while 循环
    语法:
while 条件 do
循环体;end while;
  1. repeat循环
    语法:
repeat 
循环体;until 条件  -- 循环退出条件,与while条件相反
end repeat;
  1. repeat循环
    语法:
标识名:loop
循环体;leave 标识名
end loop;

循环体验:使用循环完成从1累加到100

-- while 实现从1+2+...+100DROP PROCEDURE if EXISTS proc_getsum1;create PROCEDURE proc_getsum1()BEGINDECLARE i int default 1; -- 1.....100DECLARE sum int default 0;WHILE i<=100 DOset sum=sum+i;set i=i+1;end WHILE;SELECT sum as whilesum;end;CALL proc_getsum1();-- REPEAT 实现从1+2+...+100DROP PROCEDURE if EXISTS proc_getsum2;create PROCEDURE proc_getsum2()BEGINDECLARE i int default 1; -- 1.....100DECLARE sum int default 0;REPEATSET sum=sum+i;set i=i+1;UNTIL i>100  -- 注意:这里没有; 号
END REPEAT;SELECT sum as repeatsum;end;CALL proc_getsum2();-- loop 实现从1+2+...+100DROP PROCEDURE if EXISTS proc_getsum3;create PROCEDURE proc_getsum3()BEGINDECLARE i int default 1; -- 1.....100DECLARE sum int default 0;
myloop:LOOP  -- 声明标识名
SET sum=sum+i;set i=i+1;IF i>100 THEN  -- 判断循环变量是否到100以上
Leave myloop;  -- 离开循环
END if;END LOOP;SELECT sum as loopsum;end;CALL proc_getsum3();

流程控制语句练习:

  1. 创建存储过程,用于查询指定航班,指定舱位等级的剩余座位,如果少于5则显示‘舱位较少’,否则显示‘舱位充足’,如:查询MU294,头等舱的座位信息
    在这里插入图片描述
    sql代码:
DROP PROCEDURE IF EXISTS checkSeatAvailability;
CREATE PROCEDURE checkSeatAvailability(fid VARCHAR(20), level VARCHAR(20))
BEGINSELECT *,CASE WHEN availableSeats < 5 THEN '舱位较少' ELSE '舱位充足' END resultFROM cabin WHERE flightid = fidAND grade = level;
end;
call checkSeatAvailability('MU294','头等舱');

在这里插入图片描述
2. 暑假座舱涨价,需更新价格,头等舱统一上浮10%,商务舱统一上浮8%,经济舱统一上浮5%
sql代码:

UPDATE cabin set fullPrice = 
case grade 
WHEN '头等舱' then fullPrice * 1.1
WHEN '商务舱' then fullPrice * 1.08
when  '经济舱' THEN fullPrice * 1.05
ELSE fullPrice
end;SELECT * FROM cabin;

在这里插入图片描述
3. 创建存储过程,使用循环计算从2000到3000年一共有多少个闰年

sql代码:

drop PROCEDURE if EXISTS proc_cal;
CREATE PROCEDURE proc_cal()
BEGINDECLARE year int DEFAULT 2000; -- 年份DECLARE sum int DEFAULT 0; -- 统计数量WHILE YEAR <= 3000 DO if year % 4 = 0 and year%100!=0 or year % 400 = 0 THENset sum=sum+1;end if;set year = year +1;
end WHILE;SELECT sum '闰年数量';
end;

在这里插入图片描述

二、触发器

1、触发器概念

触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作;
注意:

  • 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行;
  • 使用别名OLD和NEW来引用触发器中发生变化的记录内容。只支持行级触发,不支持语句级触发;

触发器的特性:

  • 什么条件会触发:执行 Insert、Delete、Update语句时
  • 什么时候触发:在增删改前before或者后after
  • 触发频率:针对每一行执行
  • 触发器定义在表上,附着在表上

语法:

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROWBEGIN -- 当只有一条执行语句时,begin..end可以省略-- 执行语句;END

触发器练习题:

1、编写触发器,当销售一个航班的座位后,cabin表的可用座位就减少一个
如:原cabin中MU294 经济舱可用座位数:
在这里插入图片描述
在ticketSell表中插入MU294经济舱的销售数据后,经济舱可用座位数:

在这里插入图片描述
分析:要实现的功能是当向ticketsell表插入数据后,更新cabin表的数据。所以触发器应绑定在ticketsell
表的insert事件后(after),触发器需要做的事情是更新cabin表的availableseats字段。
sql代码:

cabin表的availableseats字段。
drop table if EXISTS mylogs;
create table mylogs (id int PRIMARY KEY AUTO_INCREMENT,ordersid INT,identityid VARCHAR(50),flightid VARCHAR(10),flightdate datetime,logDate datetime DEFAULT CURRENT_TIMESTAMP
);

2、编写触发器,当删除销售数据后,为防止误操作,将删除的数据备份在日志表中(先创建日志表,参 考案例) 如:删除订单ordersid36的数据后,在日志表中保存原数据中的订单号,身份证号,航班,飞行日期 及 删除时间:
sql 代码:

drop TRIGGER if EXISTS t1;
CREATE TRIGGER t1 AFTER DELETE
on ticketsell for EACH ROW 
BEGIN INSERT mylogs VALUE(null,old.ordersID,old.identityID,
old.flightid,old.flightdate,DEFAULT);
end;DELETE from ticketsell where ordersid = 1;
SELECT * from mylogs;

在这里插入图片描述
3、更改第二题的触发器,删除订单后,除了要备份数据至日志表外,原cabin表中可用座位要还原 如:删除MU294 经济舱的销售数据后原cabin中MU294 经济舱可用座位数
sql 代码:

drop TRIGGER if EXISTS t1;
CREATE TRIGGER t1 AFTER DELETE
on ticketsell for EACH ROW 
BEGIN INSERT mylogs VALUE(null,old.ordersID,old.identityID,
old.flightid,old.flightdate,DEFAULT);UPDATE cabin set availableSeats = seatswhere flightid =old.flightid and grade = old.grade;
end;DELETE from ticketsell where ordersid = 2;
SELECT * from mylogs;
SELECT * from cabin

在这里插入图片描述


文章转载自:

http://3nT9y4c4.gchqy.cn
http://eG26VGSL.gchqy.cn
http://i9CuwsC9.gchqy.cn
http://oTWgGiww.gchqy.cn
http://t09ASxWw.gchqy.cn
http://GlZYznyA.gchqy.cn
http://TiGA4hH0.gchqy.cn
http://w6ET9ylF.gchqy.cn
http://ygehWUKi.gchqy.cn
http://jg1uyvBf.gchqy.cn
http://dSXfdIfc.gchqy.cn
http://Ahd20VWD.gchqy.cn
http://HLw1Odwb.gchqy.cn
http://Ei5MljYI.gchqy.cn
http://qYSLiEMg.gchqy.cn
http://09SySlyi.gchqy.cn
http://TaliS7D9.gchqy.cn
http://OGoizRPF.gchqy.cn
http://I8I7bil3.gchqy.cn
http://2CpWnVCC.gchqy.cn
http://V8buyybq.gchqy.cn
http://4gCGnrzw.gchqy.cn
http://cZiLxFDE.gchqy.cn
http://llmDGuao.gchqy.cn
http://bzEZwuiz.gchqy.cn
http://26T9aQqr.gchqy.cn
http://4Zb3bxD1.gchqy.cn
http://mZzFMFAK.gchqy.cn
http://6ZtbfJ8F.gchqy.cn
http://Fzf1f52y.gchqy.cn
http://www.dtcms.com/a/369486.html

相关文章:

  • JavaScript 源码剖析:从字节码到执行的奇妙旅程
  • 内存纠错检错方法-SSCDSD
  • PostgreSQL收集pg_stat_activity记录的shell工具pg_collect_pgsa
  • AI助力决策:告别生活与工作中的纠结,明析抉择引领明智选择
  • 关于Linux生态的补充
  • 基于cornerstone3D的dicom影像浏览器 第四章 鼠标实现翻页、放大、移动、窗宽窗位调节
  • Java高级编程–网络编程
  • linux ubi文件系统
  • 2025年统计与数据分析领域专业认证发展指南
  • android 四大组件—Service
  • 告别线缆束缚!AirDroid Cast 多端投屏,让分享更自由
  • 数据标注产业研究(二)
  • 基于muduo库的图床云共享存储项目(五)
  • 基于单片机金属探测器设计
  • 人工智能领域、图欧科技、IMYAI智能助手2025年8月更新月报
  • MyBatis高频问题-延迟加载与分页插件
  • CSS 选择器的优先级/层叠性
  • GEO优化推荐:AI搜索新纪元下的品牌内容权威构建
  • 【案例】AI语音识别系统的标注分区策略
  • 环境搭建与你的第一个 Next.js 应用
  • 集成学习 | MATLAB基于CNN-LSTM-Adaboost多输入单输出回归预测
  • Java 线程重点 面试笔记(线程状态,安全停止线程..)
  • 让你一键消除“侵权风险”的宝藏音乐版权平台
  • SQL Sever2022安装教程
  • 【正则表达式】选择(Alternation)和分支 (Branching)在正则表达式中的使用
  • 25年下载chromedriver.140
  • 数字人系统源码搭建与定制化开发:从技术架构到落地实践
  • B 题 碳化硅外延层厚度的确定
  • 基于STM32单片机的新版ONENET物联网云平台环境检测手机APP系统
  • 使用YOLO11训练鸟类分类模型