1.视图
1.视图是从一张或几张表导出的虚拟表。作用是方便用户对数据的操作。
2.数据库中并能没有存放视图的数据,这些数据存放在原来的表中。在使用视图查询数据时,数据库从原来的表中取出对应的数据。所以,视图中的数据依赖于原来表中的数据。表中的数据改变时,视图中的数据也会更新,反之,视图中的数据改变时,表中的数据也会更新。
3.视图操作:(只能查询)
3.1创建视图(需要CREATE VIEW权限)
create view view_student as select sid,sname,ssex from student #视图用到的查询结果
3.2修改视图
create or replace view view_student(v_id,v_name,v_classid) as select sid,sname,ssex from student
3.3删除视图
drop view if exists view_student
4.视图的作用:简化查询、避免频繁访问数据库、过滤数据(可以隐藏某些字段,增加数据安全性)、提高表的逻辑独立性(可以屏蔽原有表结果带来的影响,例如增加或删除未被视图引用的列,对视图不会造成影响;同样,如果修改表中的某些列,可以使用视图来解决修改这些列带来的影响)
2.存储过程
1.存储过程是一组为了完成特定功能的sql语句集,在数据库中经过第一次编译之后,再次调用不需要重复编译,用户通过指定的存储过程名字和参数执行存储过程。(PS:类似于函数)
2.
2.1创建存储过程(无参)
delimiter $$ -- 修改定界符
create procedure proc_showstudet() -- 创建存储过程
BEGIN
select sid,sname,ssex,birthday,classid from student;
END $$ -- 结束
delimiter ; -- 恢复默认定界符
2.2调用存储过程:
call proc_showstudet(); -- 调用无参存储过程
3.创建存储过程(带参)
3.1创建存储过程
delimiter $$
create procedure proc_canshu(
in x int, -- 只入参
out y int, -- 只出参
inout z int -- 入参以及出参
)
begin
set x=x+1; -- set关键字对变量进行操作
set y=y+1;
set z=z+1;
end $$
delimiter ;
3.2调用存储过程
set @a=10; -- 存储过程外部使用set关键字+@定义变量
set @b=20;
set @c=30;
call proc_canshu(@a,@b,@c); -- 调用有参存储过程
select @a,@b,@c; -- a=10 b=null c=31
vc/
4.存储过程与函数的区别
语法不同:函数是function 存储过程时procedure
执行不同:函数必须依赖表达式的调用,存储过程可独立执行
返回值不同:函数只能返回一个结果,存储过程可以返回多个
功能不同:函数不易做复杂业务逻辑,但存储过程可以
5.面试题
写一个分页操作的存储过程
delimiter $$
create procedure proc_fenye_prac(
in curpage int,
in pagesum int,
out contentsum int,
out pagecount int
)
BEGIN
declare x int; -- 存储过程中使用declare关键字声明变量
declare y int;
set x=(curpage-1)*pagesum;
set y=pagesum;
select count(*) from student into contentsum;
set pagecount=contentsum/pagesum;
select * from student limit y offset x;
END $$
delimiter ;
-- 调用
call proc_fenye_prac(1,3,@contentsum,@pagecount); -- 对存储过程中只出参的参数在调用时要进行接收
select @contentsum,@pagecount ;