mysql常量,变量,循环语句,存储过程,触发器,分隔符
常量:参与运算给变量赋值
字符串:用成对的单引号/双引号括起来
数值型:二进制,十进制,八进制,十六进制
日期时间:年-月-日-时-分-秒-微妙
布尔值: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,岁
触发器: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
begininsert 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
beginupdate 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
beginif(new.name=old.name) then select '相同' into @check;elseselect '不同' 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
begininsert into table_luichun02 values(new.id,new.name,0);
end $
delimiter ;#创建删除触发器
delimiter $
create trigger delete_luichun01
before delete#因为设置了外键,需要先删除外键关联的信息再进行删除主键中的信息
on table_luichun01 for each row
begindelete 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;
mysql常量,变量,循环语句,存储过程,触发器,分隔符相关推荐
- Mysql中的循环语句
mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: while 循环 . loop 循环和repeat循环.还有一种非标准的循环: goto. 鉴于goto 语句的跳跃性会造成使用的的思 ...
- mysql没有for循环语句(使用while替代)
MySQL是不支持for循环语句的, MySQL支持while循环.repeat循环.loop循环(创建存储过程,然后调用执行) 1.while循环 delimiter // #定义标识符为双斜杠dr ...
- mysql的for循环语句_Mysql实现for循环遍历
一.目标背景 今天需要修改数据库中的一小部分数据,而逻辑中需要实现一个for循环,将一列数据依次传入目标SQL中作为条件,由于需要改的数据相当小,就不想写代码实现了,于是研究了下怎么用SQL实现: 需 ...
- mysql的while循环语句,MySQL循环语句之while循环测试
MySQL有循环语句操作,while 循环.loop循环和repeat循环,目前我只测试了 while 循环,下面与大家分享下 mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: whi ...
- MySQL三种循环语句的区别_While、Loop和Repeat三种循环语句有什么异同?
相同点:不可单独使用,主要用于存储过程和函数FUNCTION中.区别:WHILE先判断,后执行:满足条件才执行.REPEAT和LOOP先执行,后判断:满足条件就结束循环.当条件为false时,REPE ...
- mysql动态sql循环语句_mysql存储过程循环遍历sql结果集,并执行动态sql
/* 将其他几张表数据复制到一张总表中 */ DROP PROCEDURE IF EXISTS sp_customer; CREATE PROCEDURE sp_customer() BEGIN -- ...
- mysql 触发器定义变量_MySQL 函数存储过程触发器定义简单示例
1.变量提示 NEW 是新值-- OLD 是旧值 INSERT 只有NEW ----UPDATE有NEW和OLD ---DELETE只有OLD 2.准备测试表(userinfo.userinfolog ...
- mysql 5.7 循环语句_MySQL循环语句|mysql|loop|delimiter|procedure|调用_网易订阅
mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 1.while循环 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQ ...
- mysql for loop_MySQL循环语句 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...
mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 1.while循环 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQ ...
- SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数
环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击"存储过程"-点击"新建存储过程" SET ANSI_NULLS ON GO SET QUO ...
最新文章
- USACO SEC.1.2 No.4 Palindromic Squares
- N叉树的深度 python实现
- [阿里云Java Web环境搭建]二、Ubuntu安装JDK
- php中append,插入节点append()、insertAfter()的特殊用法:对原有DOM元素进行移动
- IE浏览器网页无法缩放怎么办 解决IE浏览器网页无法缩放的方法
- IntellijIDEA中maven模块中POM文件不生效
- mysql 5.7 编译_MySQL5.7.20编译安装
- PowerDesigner的CDM模型将低驼峰命名法则的每个大写字母前加_符
- MSN Messenger协议
- 华为数通HCIA笔记(OSI七层)
- 阿里云活动价格点击购买时价格上涨的解决办法
- Windows安全设置-当前的安全设置不允许从该位置下载文件
- R语言获取国内的股票数据
- Leco题目:寻找两个正序数组的中位数
- 40个华丽的复古风格Photoshop教程
- XML Publisher 模板开发小技巧
- 机器人相互教学让知识瞬间转移 AI迎来指数级进化 | 技术
- 手机没有android,安卓手机数据没了怎么恢复-互盾安卓恢复大师
- 思科路由器限速设置全解
- 同花顺2020春招一面二面在线编程题(java开发)
热门文章
- php7 on winxp 支持的模块
- C++中去掉string字符串中的\r\n等
- delphi FastReport 安装方法
- [导入]更新:让UpdatePanel支持上传文件
- 什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?
- laravel 环境自编译过程
- 作用域-基础知识总结------彭记(07)
- python request属性及方法说明
- hdu 4775 Infinite Go(暴力)
- 你造吗?这个属性值你写错了多少年?target=“_blank”