mysql简单总结存储结构+函数+视图+触发器

3 篇文章 0 订阅
1 篇文章 0 订阅

1 存储结构

定义:存储过程就是多个sql语句的组合,并加上一定的逻辑。

优点:

1 第一次执行存储过程,mysql会编译该存储过程的语句,后续再执行该存储过程,无需编译,直接执行。普通的sql语句,每次运行都要先编译后执行,所以存储过程会比普通的sql执行速度较快一点。

2 如果存在多个复杂的数据库操作,在代码中执行一个个sql,为了保证数据库数据库的一致性,只能通过事务来解决,如果全部写入存储过程,即无需事务,一次执行完毕。

1.1 创建存储过程

1.1.1  无参存储过程

    delimiter $
    create PROCEDURE pro_test01()
	begin 
	select *from ws_chat_log;
	end $
	delimiter

上诉语句中:delimiter $和 delimiter // 效果一样,看每个人的习惯。

在mybatis中调用存储过程

<select id="callProduct" resultType="cn.nldxm.windspace.website.model.mysql.MysqlTest">
		call pro_test01()
	</select>

1.1.2 有参存储过程

    delimiter $
	create PROCEDURE pro_test03(in a int)
	begin 
	select *from ws_chat_log where id = a;
	end $
	delimiter

1.1.3 参数解析

IN: 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT: 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT: 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

1.1.4 in的例子

    delimiter $
	create PROCEDURE pro_test03(in a int)
	begin 
	select *from ws_chat_log where id = a;
	end $
	delimiter

mybatis中的写法

<select id="callProductWithParam" resultType="cn.nldxm.windspace.website.model.mysql.MysqlTest">
    call pro_test03(
    #{id}
    )
<select>

1.1.5 out的例子

    delimiter $
	CREATE PROCEDURE proc_out_damo4(out a int,out b VARCHAR(255)) 
	begin
	select id,pic_name
	#绑定值
	into a,b 
	from ws_thousand_pic_src where id = 1;
	end $
	delimiter

mybatis的写法

<select id="proc_out_damo1" statementType="CALLABLE" parameterType="java.util.Map">
	  {
		call proc_out_damo4(#{id,mode=OUT,jdbcType=INTEGER},#{picName,mode=OUT,jdbcType=VARCHAR})
		}
</select>

java代码:

    mapper:
    //注意没有返回参数!
    void proc_out_damo1(Map<String,Object> map);

调用:

Map<String,Object> map = new HashMap<>(8);
	map.put("id",null);
            map.put("picName",null);
            mapper.proc_out_damo1(map);

取值:

结果值在map的id key中

1.1.6 inout的例子

    delimiter $
	CREATE PROCEDURE proc_inout_damo2(inout a int) 
	begin
	select a;
	set a = 3;
	end $
	delimiter

mybatis写法

<select id="prodInoutDamo1" statementType="CALLABLE" parameterType="java.util.Map" resultType="java.lang.Integer">
    {
    call proc_inout_damo2(#{id,mode=INOUT,jdbcType=INTEGER})
    }
</select>

mapper:

Integer prodInoutDamo1(Map<String,Object> map);

调用:

Map<String,Object> map = new HashMap<>(8);
map.put("id",10);
int a = mapper.prodInoutDamo1(map);

取值:

结果值再map的id key中

1.1.7 变量

局部变量

        DECLARE l_int int unsigned default 4000000;  
		DECLARE l_numeric number(8,2) DEFAULT 9.95;  
		DECLARE l_date date DEFAULT '1999-12-31';  
		DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  
		DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

用户变量

set @a = 1;

1.2 修改存储过程

目前,MySQL还不提供对已存在的存储过程的代码修改.如果,一定要修改存储过程的diam,必须,先将存储过程删除之后,在重新编写代码,或者创建一个新的存储过程

1.3 删除存储过程

#pro_name 是存储过程的名称
DROP PROCEDURE pro_name;

2 函数

mysql中存在很多已经定义好的函数,例如sum()。mysql也支持我们自己创建自定义函数;

函数只会返回一个值,不像存储结构,既可以返回一个值,也可以返回一个集合。

2.1 创建函数

create function 函数名([参数列表]) returns 数据类型
    begin
	 sql语句;
	 return 值;
	end;

例1:

CREATE FUNCTION fuc1(a int) returns int
	begin
	#sql语句
	return 100;
	end;

2.2 调用函数

select fuc1(10);

2.3 函数的查看

show create function 函数名;
例:show create function fuc1;

2.4 函数的修改

函数的修改只能修改一些如comment的选项,不能修改内部的sql语句和参数列表。

2.5 函数的删除

drop function 函数名
例:drop function fuc1

2.6 注意事项

存储过程和函数的区别
            存储过程:不允许执行return,但是通过out返回多个值;存储过程的限制相对较少;作为一个单独部分来执行;
            函数:只能通过return语句返回单个值或表对象;限制较多,不能使用零时表,只能用表变量,还有一些函数不可用;可以嵌入sql语句中使用。
        不能修改存储过程中的代码,只能删了重写一个;
        存储过程可以调用其他存储过程,但是不能删除其他存储过程;
        定义存储过程参数列表时,要把参数名与数据库中的字段区分开来。否则会出现无法预料的结果。
        传入中文参数要注意,在参数后面要加上character set gbk
        存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

3 视图

定义:是虚拟表,MYSQL5.0后开始使用视图,从数据库一个表或多个表中导出来的表。一经定义就存储在数据库汇总,若基本表发生变化,则这种变化也会自动反映到视图上。

3.1 创建视图

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [{column_list}] AS SELECT_statement [WITH[CASCADED | LOCAL] CHECK OPTION]
		CREATE 是创建表 REPLACE 是替换表 。
		ALGORITHM 是选择算法。
			UNDEFINED :让mysql自动选择算法;
			MERGE:将引用视图语句与视图的sql语句合并起来,最后一起执行;
			TEMPTABLE:将视图的结果存入临时表,然后用临时表来执行语句。
		CASCADED与LOCAL为可选参数。CASCADED为默认值,表示更新视图时要满足所有相关视图和表的条件:LOCAL表示更新视图的时候满足视图本身定义的条件即可。
#单表创建视图
CREATE VIEW view_t as SELECT quantity,prive,quantity*prive FROM t;
		
#多表创建视图
CREATE VIEW stu_glass (id, NAME, glass) AS SELECT student.s_id, student. NAME, stu_info.glass FROM student, stu_info WHERE student.s_id = stu_info.s_id;

3.2 调用视图

select * from v_damo1;

3.3 查看视图

DESCRIBE 视图名;查看视图表的结构
show table status like '视图名';
show create view 视图名;查看视图的详细信息;
在mysql中,information_schema数据库下的views表存储了所有视图的定义:select * from     information_schema.views;

3.4 修改视图

CREATE OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [{column_list}] AS SELECT_statement [WITH[CASCADED | LOCAL] CHECK OPTION]
		ALTER 语句修改视图
		ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [{column_list}] AS SELECT_statement [WITH[CASCADED | LOCAL] CHECK OPTION]

3.5 删除视图

DROP VIEW view_name

3.6 注意事项

表和视图的区别
        1:视图是已经编译好的sql语句,基于sql语句结果集可视化的表,而表不是。
        2:视图没有实际的物理记录,而基本表有。
        3:表是内容。视图是窗口。
        4:表占用物理内存,而视图不占,视图只能用创建语句来修改。
        5:视图是查看数据的一种方法;防止用户接触数据表。
        6:表属于全局模式,是实表,视图属于全局模式属于虚表。
        7:视图的建立和删除只影响视图本身,不影响对应的基本表。

4 触发器

定义:触发器即在表的insert、update、delete的前后进行的操作。所以一个表最多只能设置六个触发器。

4.1 创建触发器

CREATE TRIGGER trigger_name 时机 事件 ON tb1_name FOR EACH ROW trigger_stmt;
事件:insert、update、delete
时机:after、before
for each row 是代表任何记录执行对应操作都会触发器
trigger_stmt:触发器语句

例:

CREATE TRIGGER trigger_damo2 
	before insert ON ws_thousand_pic_src 
	FOR EACH ROW 
	insert ws_trigger(message)value("触发器插入数据");

当你执行
    insert into ws_thousand_pic_src (pic_source,pic_url,pic_name,oss_url,oss_status) value(0,"测试","测试","测试",1);
    时,就会触发插入操作,在ws_trigger表中新增一条数据。

4.2 查看触发器

SHOW TRIGGERS;
	SELECT * FROM INFORMATION_SCHEMA .TRIGGERS WHERE TRIGGER_NAME = '...';

4.3 删除触发器

DROP TRIGGER trigger_name

4.4 注意事项

1:相同的表相同的事件只能创建一个触发器
2:及时删除不再需要的触发器
3:MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值