视图
创建视图
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。
CREATE VIEW view_name as
select……
说明:
- view_name自己定义的视图名
- as后面是这个视图所用到的查询结果
视图的操作
视图的查询
查询所有的视图
select * from
information_schema.VIEWS
WHERE table_schema = ‘库名';
视图可以当作一张表来使用,所以用正常的select查询即可
查看视图的建立
SHOW CREATE VIEW view_name
删除存储过程
DROP VIEW view_name
视图的作用
- 简化查询
- 重写格式化数据
- 频发访问数据库
- 过滤数据
#视图
-- 视图只能用来查询,不能做增删改
-- 创建视图
-- CREATE VIEW 视图名[view_xxx / v_xxx]
-- as 查询语句
USE myschoolxxx
CREATE VIEW v_stu_man AS
SELECT * FROM student WHERE ssex='男';
-- 视图使用
SELECT * FROM v_stu_man
--
CREATE VIEW v_vstuman_class AS
SELECT v_stu_man.*,classname FROM v_stu_man
LEFT JOIN class ON v_stu_man.classid=class.classid
SELECT * FROM v_vstuman_class
UPDATE student SET sname='赵蕾蕾' WHERE sid=1
SELECT * FROM student
SELECT * FROM v_stu_man -- student 表改变,视图会跟着一起改变
-- 查看库中所有视图
SELECT * from information_schema.views
where table_schema='myschoolxxx'
-- 删除视图
DROP VIEW v_stu_man
存储过程
存储过程(Stored Procedure)是在大型数据量系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
使用存储过程的理由
- 业务流程复杂:业务复杂时,SQL语句相互依赖,顺序执行
- 频繁访问数据库:每条SQL语句都需要单独连接和访问数据库
- 先编译后执行:SQL语句的执行需要先编译
创建存储过程
CREATE PROCEDURE (
[ [IN |OUT |INOUT ] 参数名 数据类型…])
BEGIN DECLARE 变量 变量类型
END
说明:
- '[ ]'内容不是必须的;
- in:表示入参;
- out:表示返回值;
- inout:表示即是入参又是返回值。
存储过程的操作
调用存储过程
CALL 存储过程名 [参数名]
查看存储过程
SELECT * FROM information_schema.ROUTINES WHERE routine_schema=‘库名’
删除存储过程
DROP PROCEDURE 存储过程名
存储过程与函数的区别
- 语法:关键字不同,存储过程时procedure,函数function;
- 执行:存储过程可以独立执行,函数必须依赖表达式的钓鱼;
- 返回值:存储过程可以定义多个返回结果,函数只有一个返回值;
- 功能:函数不易做复杂的业务逻辑,但是存储过程可以。
存储过程的缺陷
- 移植性:大多数关系型数据库的存储过程 存在细微差异。
- 维护性:存储过程的维护成本高,修改调试较为麻烦。
- 协作性:没有相关的版本控制或者IDE,团队中对于存储过程的使用大多是依赖文档。
#存储过程
-- 本质是一个函数,但是比函数强大得多
-- 存储过程创建
CREATE PROCEDURE 存储过程名 [proc_xxx](形参列表)
BEGIN
一组sql语句集
END
-- 创建最简单的存储过程
delimiter $$
CREATE PROCEDURE proc_test()
BEGIN
SELECT * FROM student;
END $$
delimiter ;
-- 使用存储过程
CALL proc_test();
-- 带参数的存储过程
delimiter $$
create procedure proc_test2(
in a int, -- in 只入参(值传递)
out b int, -- out 只出参 (无)
inout c int -- inout 出入参 (引用传递)
)
begin
set a = a+1;
set b = b+100;
set c = c+1000;
end $$
delimiter ;
-- 环境变量 @ 局部环境变量 @@ 全局环境变量
set @x = 10; -- 11 10 null
set @y = 20; -- 120 20 null
set @z = 30; -- 1030 30 null
select @x, @y, @z;
call proc_test2(@x,@y,@z)
select @x, @y, @z;
-- 查询学生表(包含总学生数、总页数)
-- 面试题
-- 分页
-- 删除存储过程
DROP PROCEDURE proc_stuPage;
delimiter $$
CREATE PROCEDURE proc_stuPage(
in curpage int,
in sizepage int,
out stucount int,
out pagecount int
)
BEGIN
DECLARE cp int; -- 方法内的变量
SET cp=(curpage-1)*sizepage;
SELECT COUNT(*) FROM student into stucount;
SET pagecount=CEILING(stucount/sizepage);
SELECT * FROM student LIMIT cp,sizepage;
END $$
delimiter;
-- 设置环境变量
SET @a=0;
SET @b=0;
call proc_stuPage(2,3,@a,@b);
SELECT @a,@b
触发器
触发器是数据库中针对数据库表操作触发的特殊的存储过程。(一种存储过程、与表相关联、自动执行)
创建触发器
CREATE TRIGGER 数据库名.触发器名
BEFORE/AFTER -- 触发顺序
INSERT/UPDATE/DELETE – 触发事件
ON 数据库.表名 -- 事件表
FOR EACH ROW
BEGIN
触发器内容 -- 事件出发后要写的语句
END$$
说明:
- 触发器触发时间分为Before和After两种;
- 主要针对表的增删改操作,可单独指定,也可全部指定。
- 查看所有的触发器
SELECT DISTINCT EVENT_OBJECT_TABLE FROM
information_schema.`TRIGGERS`
WHERE EVENT_OBJECT_SCHEMA=‘数据库名'
触发器的查看
查看所有的触发器:
SELECT * FROM information_schema.`TRIGGERS` WHERE trigger_schema = ‘库名'
删除触发器:
DROP TRIGGER 触发器名
触发器常见案例
利用触发器映射部门表中每个部门的总人数和平均工资,步骤:
- 创建部门表,包含字段部门编号,部门名称,部门人数和平均工资;
- 创建触发器;
- 分别执行DML语句验证。
利用触发器记录删除的数据,并保存在删除表中,步骤:
- 创建删除记录表;
- 创建触发器;
- 执行DELETE语句验证。
存储过程和触发器的区别
语法:关键字不同,存储 过程是procedure, 触发器是trigger;
执行:存储过程需要调用才执 行,触发器自动执行;
返回值:存储过程可以定义返回值, 但是触发器没有返回值;
功能:存储过程是一组特定功能的 SQL语句,触发器则是SQL语 句前后执行,本身不影响原功 能。
#触发器
-- 创建触发器
-- 触发器隐式执行
-- delimiter $$
-- CREATE TRIGGER 触发器名 【trig_xxx】
-- BEFORE/AFTER INSERT/UPDATE/DELETE
-- on 表名 for each row
-- BEGIN
-- 触发后执行的一组sql语句
-- END
-- delimiter ;
-- 删除学生 sid 为 1 在此之前把学生成绩删除
delimiter $$
CREATE TRIGGER trig_delstu_delsc
BEFORE DELETE ON student FOR EACH ROW
BEGIN
-- old 已经存在的数据、new 还不存在的数据
DELETE FROM sc WHERE sid=old.sid;
END $$
delimiter ;
DELETE FROM student WHERE sid=2;
SELECT * FROM student
SELECT * FROM sc
-- 触发器隐式执行
[SQL] delete from student where sid = 2;
受影响的行: 1
时间: 0.008ms
SELECT * FROM information_schema.`TRIGGERS`
WHERE trigger_schema = 'myschool'
drop trigger trig_delstu_delsc