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

字符串:用成对的单引号/双引号括起来
数值型:二进制,十进制,八进制,十六进制
日期时间:年-月-日-时-分-秒-微妙
布尔值: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常量,变量,循环语句,存储过程,触发器,分隔符相关推荐

  1. Mysql中的循环语句

    mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: while 循环 . loop 循环和repeat循环.还有一种非标准的循环: goto. 鉴于goto 语句的跳跃性会造成使用的的思 ...

  2. mysql没有for循环语句(使用while替代)

    MySQL是不支持for循环语句的, MySQL支持while循环.repeat循环.loop循环(创建存储过程,然后调用执行) 1.while循环 delimiter // #定义标识符为双斜杠dr ...

  3. mysql的for循环语句_Mysql实现for循环遍历

    一.目标背景 今天需要修改数据库中的一小部分数据,而逻辑中需要实现一个for循环,将一列数据依次传入目标SQL中作为条件,由于需要改的数据相当小,就不想写代码实现了,于是研究了下怎么用SQL实现: 需 ...

  4. mysql的while循环语句,MySQL循环语句之while循环测试

    MySQL有循环语句操作,while 循环.loop循环和repeat循环,目前我只测试了 while 循环,下面与大家分享下 mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: whi ...

  5. MySQL三种循环语句的区别_While、Loop和Repeat三种循环语句有什么异同?

    相同点:不可单独使用,主要用于存储过程和函数FUNCTION中.区别:WHILE先判断,后执行:满足条件才执行.REPEAT和LOOP先执行,后判断:满足条件就结束循环.当条件为false时,REPE ...

  6. mysql动态sql循环语句_mysql存储过程循环遍历sql结果集,并执行动态sql

    /* 将其他几张表数据复制到一张总表中 */ DROP PROCEDURE IF EXISTS sp_customer; CREATE PROCEDURE sp_customer() BEGIN -- ...

  7. mysql 触发器定义变量_MySQL 函数存储过程触发器定义简单示例

    1.变量提示 NEW 是新值-- OLD 是旧值 INSERT 只有NEW ----UPDATE有NEW和OLD ---DELETE只有OLD 2.准备测试表(userinfo.userinfolog ...

  8. mysql 5.7 循环语句_MySQL循环语句|mysql|loop|delimiter|procedure|调用_网易订阅

    mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 1.while循环 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQ ...

  9. mysql for loop_MySQL循环语句 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...

    mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 1.while循环 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQ ...

  10. SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数

    环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击"存储过程"-点击"新建存储过程" SET ANSI_NULLS ON GO SET QUO ...

最新文章

  1. USACO SEC.1.2 No.4 Palindromic Squares
  2. N叉树的深度 python实现
  3. [阿里云Java Web环境搭建]二、Ubuntu安装JDK
  4. php中append,插入节点append()、insertAfter()的特殊用法:对原有DOM元素进行移动
  5. IE浏览器网页无法缩放怎么办 解决IE浏览器网页无法缩放的方法
  6. IntellijIDEA中maven模块中POM文件不生效
  7. mysql 5.7 编译_MySQL5.7.20编译安装
  8. PowerDesigner的CDM模型将低驼峰命名法则的每个大写字母前加_符
  9. MSN Messenger协议
  10. 华为数通HCIA笔记(OSI七层)
  11. 阿里云活动价格点击购买时价格上涨的解决办法
  12. Windows安全设置-当前的安全设置不允许从该位置下载文件
  13. R语言获取国内的股票数据
  14. Leco题目:寻找两个正序数组的中位数
  15. 40个华丽的复古风格Photoshop教程
  16. XML Publisher 模板开发小技巧
  17. 机器人相互教学让知识瞬间转移 AI迎来指数级进化 | 技术
  18. 手机没有android,安卓手机数据没了怎么恢复-互盾安卓恢复大师
  19. 思科路由器限速设置全解
  20. 同花顺2020春招一面二面在线编程题(java开发)

热门文章

  1. php7 on winxp 支持的模块
  2. C++中去掉string字符串中的\r\n等
  3. delphi FastReport 安装方法
  4. [导入]更新:让UpdatePanel支持上传文件
  5. 什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?
  6. laravel 环境自编译过程
  7. 作用域-基础知识总结------彭记(07)
  8. python request属性及方法说明
  9. hdu 4775 Infinite Go(暴力)
  10. 你造吗?这个属性值你写错了多少年?target=“_blank”