使用视图
视图是虚拟的表。所以在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其它视图或表,甚至能添加和更新数据,然而并不是所有的视图都能够进行添加和更新的操作。 所以在对视图进行相应的操作之前,我们先来讲解一下视图的规则和限制:
-
与表一样,视图必须唯一命名(不能给视图取与别的视图或者表相同的名字) -
对于可以创建的视图数目没有限制 -
为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予的。 -
视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。 -
ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY(即构建这个视图的SELECT中同样含有ORDER BY),那么构造这个视图的SELECT中的ORDER BY将会被覆盖。 -
视图不能索引,也不能有关联的触发器或默认值。 -
视图可以和表一起使用,利用,编写一条连接表和视图的SELECT语句。
在讲解视图的使用规则之后,我们就要开始使用视图了:
-
利用CREATE VIEW view_name AS SELECT XXX FROM table_name YYY; 从而从SELECT子句中检索到的数据用来构建vie_name的视图。 -
SELECT xxx1,xxx2,xxx3…xxxn FROM view_name; 用来检索view_name中的数据. -
SHOW CREATE VIEW view_name;用来显示构建view_name这个视图的MySQL语句。 -
DROP VIEW view_name; 用来删除view_name这个视图. -
UPDATE view_name SET 列名1 = 新值1,列名2 = 新值2 WHERE xxx; --用来修改符合WHERE子句中的对应的列的值。 -
DELETE FROM view_name WHERE xxx; 删除符合WHERE条件的行。 但值得一提的是,一旦更新了视图,那么对应的基表同样会做出相应的变化。同时需要注意,更新和删除视图的某一行需要在一定的条件下才可以进行,否则就会发生报错.
但是并不是所有的视图都可以进行更新的,在构建视图的SELECT语句中只要有下面的一个条件,那么视图就不可以进行更新:
- 聚集函数
- 分组(使用GROUP BY和HAVING)
- 联结
- 子查询
- 并(UNION)
- DISTINCT
- 导出(计算)列
使用存储过程
存储过程,简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。基于此,我们就会很容易知道为什么需要使用存储过程了: 所以,接下来我们将来讲解存储过程的创建、使用、删除的操作:
创建存储过程:
CREATE PROCEDURE procedure_name()
BEGIN
SELECT xxx FROM table_name;
.........一系列的SQL语句
END;
然而,如果利用MySQL命令行来写的话,就会发生报错: 因此利用MySQL命令行创建存储过程之前,需要利用DELIMITER //指定临时结尾符尾//,然后需要在END后面写上//,此时对应的存储过程就创立成功了。然后需要再次利用DELIMITER ;指定结尾符为 ;。
执行存储过程:
CALL procedure_name();
如果创建存储过程的括号里面有参数,那么对应地执行CALL语句的括号里面也要有对应地参数。否则,没有参数的时候,直接写一个括号就好。不可以不写括号,因为存储过程本之上就相当于一个函数。
而利用CALL procedure_name()可能显示数据,也可能不会显示数据,取决于括号里面是否存在参数,并且这个参数被什么修饰的。一般,存储过程并不显示结果,而是把结果返回给你指定的变量。
删除存储过程:
DROP PROCEDURE procedure_name;注意这时候不需要再写存储过程名字后面的括号了,直接就是它的存储过程名
但是这样可能会发生报错,因为可能存在procedure_name不存在的情况,所以这个语句也可以修改为
DROP PROCEDURE IF EXISTS procedure_name;
显示创建的存储过程的CREATE语句:
SHOW CREATE PROCEDURE procedure_name;注意这时候不需要再存储过程后面的括号了,直接就是存储过程
的名字即可
获得包括何时、由谁创建等详细信息的存储过程列表,需要使用SHOW PROCEDURE STATUS procedure_name;注意这时候并不需要再存储过程名后面加上括号了,直接写存储过程名即可。
然而SHOW PROCEDURE STATUS procedure_name却发生了报错,这是因为需要限制过程状态的结果。所以需要改成SHOW PROCEDURE STATUS LIKE "procedere_name";利用LIKE指定一个过滤模式从而达到限制输出的目的.
触发器
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句),触发器主要分为三种类型:
所以在讲解这三种触发器之前,我们需要知道怎样创建一个触发器: 毫无疑问,在创建触发器之前,我们需要知道的信息主要有:
- 唯一的触发器名
- 触发器关联的表
- 触发器应该相应的活动(DELETE或INSERT或UPDATE)
- 触发器何时执行(之前还是之后)
基于上面几个条件,我们将可以知道创建触发器的SQL语句了:
CREATE TRIGGER trigger_name
BEFORE / AFTER DELETE / UPDATE /INSERT ON table_name FOR EACH ROW
SELECT/SET XXXX;
举一个书上的例子:
然而照着书上的例子运行的时候,却发现出现了错误: 所以创建的时候,还需要再SELECT之后添加INTO @xxx字段才可以。
所以正确的语法形式为:
CREATE TRIGGER trigger_name
AFTER / BEFORE UPDATE/ INSERT / DELETE ON table_name
FOR EACN ROW
SELECT / SET XXX INTO @yyy.之所以可以存在SET是因为再进行插入或者更新的时候可以进行SET的操作,而DELETE只能进行SELECT操作
了解创建触发器之后,我们当然需要知道怎样删除触发器啦,和之前的语法类似,DROP TRIGGER trigger_name,从而实现删除trigger_name这个触发器,然而如果trigger_name这个触发器不存在,那么这个句段就会发生报错,所以为了避免这种情况,所以利用IF EXISTS,所以DROP TRIGGER IF EXISTS trigger_name,从而保证了trigger_name这个触发器哪怕不存在执行这个字段也不会发生报错.
对应得规则为如下:
-
DELETE 触发器 而对于DELETE触发器,规则刚好和INSERT相反,它具有的是OLD得虚拟表,表示要被删除得行。因为是被删除,所以对于OLD只能进行SELECT操作,而不可以做其他操作了。 -
UPDATE 触发器 而对于UPDATE触发器来说,它的规则为: -
在UPDATE触发器中,可以引用一个名为OLD虚拟表访问更新前得值,引用名为NEW的虚拟表访问更新后的值 -
在BEFORE UPDATE触发器中,NEW的值可以被更改,也即可以进行SET操作,而在AFTER UPDATE触发器中只能进行SELECT操作. -
OLD的值全都是只读的,不可以更新。
|