存储过程、存储函数、触发器、索引的使用

存储过程

  1. pl/sql语言
  2. 存储过程:
    • 存储过程:存储过程就是提前已经编译好的一段pl/sql语言,放置在数据库端,可以直接被调用。这一段pl/sql一般是固定步骤的业务
  3. 存储过程创建语法
Create [or replace] PROCEDURE 过程名称[(参数名 in/out 数据类型)]//不写默认是in

AS/IS

BEGIN
	PLSQL子程序体
END;
  1. 使用存储过程
-- 给指定员工涨100块钱
create or replace PROCEDURE p1(eno emp.empno%type) --省略in/out就是in

AS 

BEGIN
	
	update emp set sal = sal + 100 where empno = eno;
	commit;

END;
  1. 测试存储过程
-- 使用声明函数,不需要调用
DECLARE

BEGIN
	p1(7788); //给7788编号员工涨了100工资
END;

存储函数

  1. 存储函数和存储过程类似,就是自己定义的一个函数,并且有返回值
  2. 创建存储函数
-- 使用存储函数实现提供一个员工编号,输出一个部门名称
create or replace function f1(dno dept.deptno%type) return dept.danme;

IS 
	-- 定义一个变量 用来存储查出来的名字
	d1 dept.dnam%type;

BEGIN
	-- into d1表示把查出来的dname存到d1里
	SELECT dname into d1 from dept where deptno = dno;
	return d1;
END;
  1. 使用f1存储函数来实现需求:查询出员工姓名,员工所在的部门名称
select e.ename, f1(e.deptno) -- 这个函数的返回值是dname
from emp e;
  1. 如果是普通sql
select e.ename, d.dname
from emp e, dept d
where e.deptno = d.deptno

存储过程和存储函数

  1. 两者的主要区别就是存储函数有return 返回值,存储过程没有返回值

  2. 存储过程要输出时需要在参数中写out,并在存储体中给out赋值

  3. in和out参数类型的区别?
    这要涉及到into查询语句或者:=赋值操作的参数,都必须使用out,否则使用in

触发器

  1. 触发器就是一种制定的规则,在我们增删改操作的时候

  2. 只要满足条件,自动触发,不需要调用

  3. 语句级触发器:不包含for each row的触发器

  4. 行级触发器:包含for each row的触发器

  5. 加for each row是为了使用:old或者:new对象或者一行记录

  6. 使用触发器实现主键自增

    • 在用户插入操作之前,拿到即将插入的数据
    • 给该数据中的主键列赋值
    • 因此用到行级触发器
create or replace trigger x
before
insert 
on person
for each row
declare 
begin 
	select s_person.nextval into :new.pid from dual;--从dual表中拿到下一个值在插入之前因此:new
end;
  1. 使用触发器(创建后自动创建)
insert into person(pname) values("a");
commit;
	-- 已经自增了 

索引

  1. 就是在表得列上创建一个二叉树,达到大幅度提高查询效率的目的。但是会影响增删改的效率
  2. 索引分单列索引和复合索引
  3. 单列索引:单列索引触发的原则,条件必须是索引中的原始值
    • 单行函数、模糊查询都不会触发索引
create index idx_name on emp(ename); 
	-- 使用
	select * from emp where ename = "scott";
  1. 复合索引
    • 复合索引的第一列为优先检索列
    • 如果要触发复合索引,必须包含有优先检索列中的原始值
create index idx_namejob on emp(ename,job);
	-- 触发复合索引的条件
	select * from emp where ename = "scott" and job = "xxx"; -- 触发
	select * from emp where ename = "scott" or job = "xxx"  -- 不触发
	select * from emp where ename = "scott"; -- 触发单列索引

你可能感兴趣的:(MySQL)