mysql常量,变量,循环语句,存储过程,触发器,分隔符 您所在的位置:网站首页 循环语句的概念 mysql常量,变量,循环语句,存储过程,触发器,分隔符

mysql常量,变量,循环语句,存储过程,触发器,分隔符

2024-03-12 10:24| 来源: 网络整理| 查看: 265

常量:参与运算给变量赋值

字符串:用成对的单引号/双引号括起来 数值型:二进制,十进制,八进制,十六进制 日期时间:年-月-日-时-分-秒-微妙 布尔值:ture/false【1/0】 null:未知,待定,没有值,无数据

变量:记录存放某一个时段的状态值

自定义变量/系统变量 自定义会话变量:断开连接前可用,断开连接后自动释放 自定义局部变量:在封装的储存程序内部可用,调用结束后释放。

会话变量定义:

set @var1 =值1; set @var1 =值1,@var2=值2;

select 值1 into var1 select 值2 into var1 ,值2 into var2; select min(book_price) into para1,max(book_price) into para2,avg(book_price) into para3;

局部变量定义:

declare var1 declare var1,var2 数据类型[default默认值] 作用:定义1-n个指定类型的局部变量,并且设置初始值 示例: declare num int default 0; declare只能用于begin…end的开头部分定义局部变量

全局系统变量 mysql启动时会根据系统配置定义全局系统变量, 并初始化为默认值(约393个全局系统变量)

生存期:从mysql启动时直到停止或重启 作用范围是整个系统,修改了它的值会影响整个系统。

程序结构 顺序,分支,循环

分支:if,case少条件:if 条件1 then 语句序列1 end if多条件:if 条件1 then 语句序列1 elseif 条件2 then 语句序列2else 语句序列n end ifcasecase when 条件1 then 语句序列1 end casecase when 条件1 then 语句序列1when 条件2 语句序列2else 语句序列nend casecase +表达式case 表达式 when 值1 then 语句序列1end casecase 表达式 when 值1 then 语句序列1when 值2 then 语句序列2else 语句序列nend case 循环语句 whilerepeatloop [开始标记:] while 条件 do 程序段 end while[结束标记][开始标记:] repeat 程序段 until 条件 end repeat[结束标记][开始标记] loop 程序段 end loop[结束标记] 创建普通的存储过程一组可编程的函数,完成特定功能的SQL语句集。经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程是具有名字的一段代码,用来完成一个特定的功能。 使用存储过程的原因将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用。进行批量处理,提升效率。统一接口,确保数据的安全。 存储过程的优点存储过程和函数允许标准组件式编程,提高了SQL语句的重用性、共享性和可移植性。存储过程能够实现较快的执行速度,能够减少网络流量。存储过程和函数可以被作为一种安全机制来利用 编写存储过程的注意事项存储过程的编写比单句SQL语句复杂,需要用户具有更高的技能和更丰富的经验。在编写存储过程时,需要创建这些数据库对象的权限。 程序procedure特性characteristic

创建存储过程

create procedure procedure_name([procedure_parameter[,...]]) [characteristic...] routine_body procedure_name:存储名字 procedure_parameter:存储过程的参数 characteristic:存储过程的特性 routine_body:存储过程的sql语句代码,可用begin...end来标志sql语句的开始和结束。

查看存储过程状态信息

show procedure status like 'procedure_name'

查看存储过程定义信息

show create procedure procedure_name;

修改存储过程:用于修改储存过程的某些特征【读写权限】

alter procedure procedure_name [characteristic...];

修改储存过程的内容可先删除改储存过程,重新创建。

删除储存过程

drop procedure procedure_name;

分隔符delemiter

存储过程的语句结构

delimiter $ begin... end $ delimiter ; 创建存储过程实例如:创建一个存储过程,查询所有读者的基本信息delimiter $create procedure p1()comment "查询所有读者的信息"beginselect * from t_readerend $delimiter ;[注意这里的分号与delimiter之间有一个空格] 调用存储过程call p1(); 小结创建:create procedure…查看状态:show procedure status like…查看定义信息:show create procedure…删除存储过程:drop procedure… 实例:

创建一个存储过程,不带参数 创建存储过程:查看表里面的信息|

delimiter $ create procedure p1() comment"查看所有table_e表的信息" begin select * from table_e; end $ delimiter ;

等同于执行

select * from table_e; 调用:调用有小括号call p1();查看存储过程的状态信息:查看没有小括号show procedure status like’p1’;查看存储过程的定义信息:查看没有小括号show create procedure p1; 查看存储的位置:在数据库的Stored Procedures表里面删除存储过程 p1,删除没有小括号drop procedure p1; 实例:

in 向过程传入值 向数据表里固定字段获取数据 创建一个有参数的存储过程

查看指定字段内的某条数据等价于delimiter $create procedure p_in(in kk varchar(10))comment '输入查询r1字段反回读者的信息’beginselect * from tanle_ewhere r1=kk;end $delimiter ;select * from table_e where r1=“kk”;in 输入参数表示调用者向过程传入值传入值可以是常量和变量 调用存储过程并输入参数相当于普通查询,把kk代入了公式里面call p_in(“a1”)call p_in(“kk”)

out 输出参数,过程向调用者传出值(返回变量中的数据,可以是多个) 向数据表里面获取固定字段数据,然后加工 创建有输出的存储过程

查询最小值,最大值,平均值等价于delimiter $ create procedure p_out(out p_min float,out p_max float,out p_avg float)comment "读者的最小/最大/平均年龄"beginselect min(r3),max(r3),avg(r3)into p_min,p_max,p_avgfrom table_e;end $ delimiter ;select min(r3),max(r3),avf(r3) from table_e;into 后面是赋值于p_min,p_max,p_avg 调用call p_out(@p_min,@p_max,@p_avg);显示SELECT @p_min, @p_max, @p_avg;

inout输入输出参数,向过程传入值,然后过程再返回来值,这些值是变量 输入字段里可选择的数据,然后加工

创建一个输入输出的存储实例等同于delimiter $create procedure p_inout(inout r3 int)comment '对该读者的出生年份加1’beginset r3=r3 + 1 ;end $delimiter ;update table_e set r3=r3+1where [condition] [;]set @r3=18;这里就是上面设置的[condition]call p_inout(@r3);这里就最后的[;]号select @r3;展示出来的变量数据,基本表是不更改的

数据表里面的参考数据:table_e r1,r2,r3,r4 a1,女,1,岁 a2,女,2,岁 a3,女,18,周岁 a4,男,4,岁 a5,男,5,岁 a6,男,6,岁 a7,男,7,岁

触发器:trigger

在数据表中发生了某个事件(擦痕入操作,删除操作,更新操作) mysql数据库系统会会自动触发预先编写好的若干条sql语句

触发器的特点及作用 具有原子性,即所有的sql语句作为一个整体,要么全部不执行,要么全部执行 触发器类型 插入触发器,删除触发器,更新触发器

语法:

create trigger 触发名字 触发时间 触发事件 on 表名 for each row [触发] 触发体 create trigger terigger_name trigger_time trigger_event on table_name for each row [trigger_order] trigger_body

触发事件:after before 触发事件:insert update delete for each row:表示任意一条 on 表:表示作用于哪张表 触发体:表示触发器的要执行的具体的sql语句 查看触发器:

show triggers#查看所有触发器 show create trigger 触发名;#查看具体的触发器

删除触发器:

drop trigger 触发名; drop trigger teigger_log_insert; drop trigger teigger_log_update; drop trigger teigger_log_delete;

实例

#创建表记录t_log create table t_log ( id int auto_increment primary key, username varchar(20), logtime datetime ); #创建数据表table_luichun create table table_luichun( id int auto_increment primary key, username varchar(20), password varchar(20) ); #创建触发器 create trigger teigger_log_insert after insert on table_luichun for each row insert into t_log(username,logtime) values('插入了数据',now()); #创建触发器 create trigger teigger_log_delete after delete on table_luichun for each row insert into t_log(username,logtime) values('删除了数据',now()); #创建触发器 create trigger teigger_log_update after update on table_luichun for each row insert into t_log(username,logtime) values('更改了数据',now()); #插入数据 insert into table_luichun(username,password) values("帐号",'密码'); #删除数据 delete from table_luichun where username='帐号'; #更改 myda数据库下的tbale_luichun表中的信息,这里的主键是id #mysql更改数据表里面的信息或数据 #方法一: update table_luichun set username = '帐号1201' where(id='2'); #方法二:指定数据库名字 update myda.table_luichun set username = '帐号01' where(id='1'); #方法三:添加`符号 update `myda`.`table_luichun` set `username` = '帐号01' where(`id`='1'); #方式四:大写 UPDATE `myda`.`table_luichun` SET `username` = '帐号2' WHERE (`id` = '1'); ##如果更新的where条件指定的步是主键则会抛出1175异常 ##Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. select * from t_log;

实例2: 创建三个表 库存表stock 销售表sale 订单表order 当订单表添加一条数据时,销售表加1,库存表减1

#创建三个表 create table stock( id int auto_increment primary key,#用于自增长的商品号 name varchar(20), number int default 0 ); create table sale( id int, name varchar(20), number int default 0 ); create table table_order( id int auto_increment primary key,#用于自增长的订单号 stock_id int, name varchar(20), number int, logtime datetime default now() ); #添加外键 #销售表外键用于当订单表有数据插入时,销售表可以通过该外键来查找 alter table sale add constraint fk_sale_id foreign key(id) references stock(id); #订单表的外键,用于当订单表有数据插入时,库存表可以通过该外键来查找 alter table table_order add constraint fk_stock_id foreign key(stock_id) references stock(id); #创建触发器,当向库存表条加了数据则在销售表添加数据 delimiter $ create trigger add_sale after insert on stock for each row begin insert into sale(id,name,number) values(new.id,new.name,0); end $ delimiter ; #创键触发器,当向订单表中添加数据,销售表销量+1,库存表数量-1 delimiter $ create trigger add_order after insert on table_order for each row begin update stock set number=number-new.number where id=new.stock_id; update sale set number=number+new.number where id=new.stock_id; end $ delimiter ; #插入数据 #向库存表中插入一条数据 insert into stock(name,number) values('热狗器',10); #向订单表中添加一条数据 insert into table_order(name,number,stock_id) values('小龙虾','5','1'); #查看触发器 show triggers; #删除触发器 drop trigger add_order; drop trigger add_sale;

更新触发器 1:更新相当于删除旧数据,插入新数据 2:旧数据存储到old表中 3:新数据存储到new表中 案例 创建触发器[table_luichun]作用于数据表[t_stock],当数据表[t_stock]中的某一条信息被更新后,将会检查某字段[name]在更新后是否与更新前一致,用变量@check来记录

# 创建table_luichun 数据表 create table table_luichun( id int auto_increment primary key, name varchar(20) ); #创建触发器 delimiter $ create trigger check_update after update on table_luichun for each row begin if(new.name=old.name) then select '相同' into @check; else select '不同' into @check; end if; end $ delimiter ; #插入数据 insert into table_luichun(name) values('大佬'); #更新数据 update table_luichun set name='大佬俊' where id='1'; #查看变量 select @check;

创建删除触发器

#创建两个数据表 create table table_luichun01( id int auto_increment primary key,#用于自增长的商品号 name varchar(20), number int default 0 ); create table table_luichun02( id int, name varchar(20), number int default 0 ); #创建外键 alter table table_luichun02 add constraint fk_luichun01_id foreign key(id) references table_luichun01(id); #创建自动创建table_luichun02数据的触发器 delimiter $ create trigger add_luichun02 after insert on table_luichun01 for each row begin insert into table_luichun02 values(new.id,new.name,0); end $ delimiter ; #创建删除触发器 delimiter $ create trigger delete_luichun01 before delete#因为设置了外键,需要先删除外键关联的信息再进行删除主键中的信息 on table_luichun01 for each row begin delete from table_luichun02 where (table_luichun02.id=old.id); end $ delimiter ; drop trigger delete_luichun01; #向table_luichun01插入数据 insert into table_luichun01(name,number) values("小龙虾",10); insert into table_luichun01(name,number) values("红烧肉",10); #测试,删除tbale_luichun01里面的数据 delete from table_luichun01 where id='1'; #查看表 select * from table_luichun01; select * from table_luichun02;


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有