MySQL必知必会4

使用视图

视图是虚拟的表。所以在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行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后面加上@主机才可以
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值