赞
踩
语法:create view 视图名【view_xxx/v_xxx】as 查询语句
- create view v_stu_man as
- SELECT * from student where ssex='男'
语法:SELECT * FROM 视图名
SELECT * FROM v_stu_man
结果:
案例1:查看男同学的信息和班级
- create view v_stuman_class as
- select v_stu_man.*,classname from v_stu_man
- left join class on v_stu_man.classid=class.classid
结果:
注意:student 表改变,视图会跟着一起改变
UPDATE student SET sname='赵蕾蕾' WHERE sid=1
表中数据已改:
查看视图中的信息:
SELECT * FROM v_stu_man
结果:
- SELECT * from information_schema.views
- where table_schema='myschool'
结果:
drop VIEW v_stu_man
CREATE PROCEDURE 存储过程名【proc_xxx】(形参列表)
BEGIN
一组SQL语句集
END
案例1:创建最简单的存储过程
delimiter $$定制定界符,delimiter ;;恢复默认定界符
- delimiter $$
- create procedure proc_test()
- begin
- select * from student;
- end $$
- delimiter ;
- -- 使用存储过程
- CALL proc_test();
结果:
案例2:创建带参的存储过程
- delimiter $$
- create PROCEDURE proc_test2(
- in a int, -- 只入参
- out b int, -- 只出参
- inout c int -- 出入参
- )
- begin
- set a=a+1;
- set b = b+100;
- set c = c+1000;
- end $$
- delimiter ;
-
- #设置环境变量:@局部环境变量 @@全局环境变量
- set @x=10;
- set @y = 20;
- set @z = 30;
-
- select @x, @y, @z;
-
- -- 运行结果为图1
- -- 使用存储过程
- call proc_test2(@x,@y,@z)
-
- select @x, @y, @z;
- -- 运行结果为图2
结果1:
结果2:
为什么使用了存储过程后会得到这样的结果呢?
因为在我们定义形参a、b、c时,前面给他们加了修饰符:in、out、inout。所以a是只入参数:即只能将参数传入,而不参与运算,所以a为10。b是只出参,即无法给它传入值,所以它为Null。c是出入参,即既可以将参数传入,也可以参与运算输出,所以c为1030。
案例3:使用存储过程达到分页效果
- delimiter $$
- create procedure proc_stuPage(
- in curpage int,
- in sizepage int,
- -- 学生数
- out stucount int,
- -- 页数
- out pagecount int
- )
- begin
- #declare:声明局部变量
- declare cp int;
- set cp=(curpage-1)*sizepage;
- -- 把表中的值存入int类型的变量(此表只能有一条数据)
- select count(*) from student into stucount;
- set pagecount=ceiling(stucount / sizepage);
- select * from student limit cp,sizepage;
- end $$
- delimiter ;
- set @a = 0; -- stucount
- set @b = 0; -- pagecount
- call proc_stuPage(2,3,@a,@b); -- 结果1
-
- -- 查看学生数和页数
- select @a,@b -- 结果2
结果1:
结果2:
语法:关键字不同,存储过程是procedure, 函数是function;
执行:存储过程可以独立执行,函数必须依赖表达式的调用;
返回值:存储过程可以定义多个返回结果, 函数只有一个返回值;
功能:函数不易做复杂的业务逻辑,但是存储过程可以。
维护性:存储过程的维护成本高,修改调试较为麻烦。
移植性:大多数关系型数据库的存储过程存在细微差异
协作性:没有相关的版本控制或者IDE,团队中对于存储过程的使用大多是依赖文档。
触发器是数据库中针对数据库表操作触发的 特殊的存储过程。
delimiter $$
CREATE TRIGGER 触发器名【trig_xxx】
BEFORE/AFTER -- 执行顺序
INSERT/UPDATE/DELETE -- 触发事件
ON 表名
案例1:删除学生 sid 为 1 在此之前把学生成绩删除
- -- 创建触发器
- delimiter $$
- create trigger trig_delstu_delsc
- before delete on student for each row
- begin
- delete from sc where sid = old.sid;
- end $$
- delimiter ;
-
- -- 触发事件
- DELETE FROM student WHERE sid=1;
-
- -- 查看学生表
- select * from student;
- -- 查看成绩表
- select * from sc;
学生表结果:
成绩表结果:
- SELECT * FROM information_schema.`TRIGGERS`
- WHERE trigger_schema = 'myschool'
结果:
DROP TRIGGER trig_delstu_delsc
删除后查看所有触发器:
语法:关键字不同,存储 过程是procedure, 触发器是trigger
执行:存储过程需要调用才执 行,触发器自动执行
返回值:存储过程可以定义返回值, 但是触发器没有返回值;
功能:存储过程是一组特定功能的 SQL语句,触发器则是SQL语 句前后执行,本身不影响原功 能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。