赞
踩
字符串:用成对的单引号/双引号括起来
数值型:二进制,十进制,八进制,十六进制
日期时间:年-月-日-时-分-秒-微妙
布尔值: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 语句序列2 else 语句序列n end if |
case |
case when 条件1 then 语句序列1 end case |
case when 条件1 then 语句序列1 when 条件2 语句序列2 else 语句序列n end case |
case +表达式 |
case 表达式 when 值1 then 语句序列1 end case |
case 表达式 when 值1 then 语句序列1 when 值2 then 语句序列2 else 语句序列n end case |
while | repeat | loop |
---|
[开始标记:] 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 "查询所有读者的信息" begin select * from t_reader end $ 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字段反回读者的信息’ begin select * from tanle_e where 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 "读者的最小/最大/平均年龄" begin select min(r3), max(r3), avg(r3) into p_min,p_max,p_avg from 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’ begin set r3=r3 + 1 ; end $ delimiter ; | update table_e set r3=r3+1 where [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,岁
在数据表中发生了某个事件(擦痕入操作,删除操作,更新操作)
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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。