使用视图
视图是虚拟的表。所以在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行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子句
执行存储过程:
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语句之间的一组语句),触发器主要分为三种类型:
- INSERT
- DELETE
- UPDATE
所以在讲解这三种触发器之前,我们需要知道怎样创建一个触发器:
毫无疑问,在创建触发器之前,我们需要知道的信息主要有:
- 唯一的触发器名
- 触发器关联的表
- 触发器应该相应的活动(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这个触发器哪怕不存在执行这个字段也不会发生报错.
- INSERT 触发器
对应得规则为如下:
-
DELETE 触发器
而对于DELETE触发器,规则刚好和INSERT相反,它具有的是OLD得虚拟表,表示要被删除得行。因为是被删除,所以对于OLD只能进行SELECT操作,而不可以做其他操作了。
-
UPDATE 触发器
而对于UPDATE触发器来说,它的规则为: -
在UPDATE触发器中,可以引用一个名为OLD虚拟表访问更新前得值,引用名为NEW的虚拟表访问更新后的值
-
在BEFORE UPDATE触发器中,NEW的值可以被更改,也即可以进行SET操作,而在AFTER UPDATE触发器中只能进行SELECT操作.
-
OLD的值全都是只读的,不可以更新。
管理事务处理
事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
然而并不是所有的引擎都支持事务处理。
在了解事务和事务处理之后,我们需要知道几个关于事务处理的术语:
-
事务:TRANSACTION。开启一个事务对应的语法格式为START TRANSACTION;.
-
回退:ROLLBACK,一旦执行了回退操作,那么这时候这个事务就已经结束了,之后再进行DELETE\UPDATE\INSERT操作就会隐含自动提交,此时没有办法使用ROLLBACK回退了。
-
保留点:SAVEPOINT,这样我们可以有效控制部分回退到对应的保留点的位置。
-
提交: COMMIT,一般MySQL语句都是直接针对数据库表执行和编写的,这就是隐含提交,即提交(写或者保存)操作是自动进行的,但是在事务处理块中,提交不会隐含地进行,为了进行明确的提交,使用COMMIT语句。
所以需要注意的细节有几个地方: -
开启事务之后,一旦执行了ROLLBACK操作,那么就会自动关闭了这个事务,此时之后在进行UPDATE\INSERT\DELETE操作的时候,就是隐含提交了,是没有办法进行ROLLBACK操作的。
-
定义保留点的时候,保留点的名字不可以和MySQL的关键字形式相同,因为MySQL不区分大小写的。
-
使用ROLLBACK TO savepoint_name的时,那么就会回退到定义savepoint_name的位置,在这个位置之后的操作一律被回退,所以定义在savepoint_name之后的保留点就被释放不存在了,但是savepoint_name这个保留点以及更早定义的保留点依旧存在,依旧可以使用的,除非执行ROLLBACK/COMMIT;操作,这样所有的保留点就会自动释放了.
如果我们需要取消自动提交的话,那么可以通过设置autocommit的值即可,如果为假,即值为0,那么表示取消自动提交,否则为真,即值为1,那么表示自动提交。
全球化和本地化
这里将介绍MySQL处理不同字符集和语言的基础知识。
利用CREATE TABLE子句来指定一个表的字符集或者校对:
不仅可以给表指定字符集和校对,也可以给每个列是设置他们.
查看一个表的字符集:SHOW CREATE TABLE table_name。这时候虽然时查看创建这个表的MySQL语句,但是最后一行有显示对应地字符集以及校对.
安全管理
MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能也不能少。换句话说,用户不能对过多的数据具有过多的访问权。
所以我们需要给用户提供他们所需的访问权,且仅提供他们所需的访问权,这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。
而我们将怎样管理用户呢?
这里值得一提的是,如果直接按照书上说的,
SELECT GRANTS FOR user_name;那么这时候就会发生报错,需要在user_name后面加上@主机才可以。