Mysql的索引、视图、触发器、存储过程(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Mysql的索引、视图、触发器、存储过程(下)

二、视图


(1)视图概述


  • 视图是一个虚拟表,内容由查询定义,和真实的表一样,视图包含一系列带有名称的列和行数据
  • 视图的作用就是缓存数据,当用户把一个SQL语句的查询结构保存到视图里后,下次查询只需要访问视图就可以,无需再次使用SQL语句进行筛选,并且修改视图会修改原表的数据
  • 视图的特点:


  1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新表
  2. 视图是由基本表(真表)产生的表(虚表)
  3. 视图的建立和删除不影响原表
  4. 对视图内容的修改、删除、插入会对原表产生直接影响,会直接修改原表
  5. 当视图的数据是来自多个表时,是不允许修改视图的数据的


(2)视图的使用


先创建表,并且插入数据

mysql> drop table aaa;
Query OK, 0 rows affected (0.01 sec)
mysql> create table aaa(id int,name char(10),age int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into aaa values(1,"zhangsan",18);
Query OK, 1 row affected (0.00 sec)
mysql> insert into aaa values(2,"wangwu",19);
Query OK, 1 row affected (0.00 sec)
mysql> insert into aaa values(3,"hehe",17);
Query OK, 1 row affected (0.00 sec)
mysql> select * from aaa;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   18 |
|    2 | wangwu   |   19 |
|    3 | hehe     |   17 |
+------+----------+------+
3 rows in

创建视图

mysql> create view a1 as  select id,name from aaa; #创建视图,as后面跟select查询语句
Query OK, 0 rows affected (0.00 sec)
mysql> show tables; #发现多了一个表,名称就是刚才视图的名称
+---------------+
| Tables_in_aaa |
+---------------+
| a1            |
| aaa           |
+---------------+
2 rows in set (0.00 sec)
mysql> select * from a1; #查看这个表,发现就是上面查询语句执行后的数据
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | wangwu   |
|    3 | hehe     |
+------+----------+
3 rows in set (0.00 sec)

更新视图

mysql> update a1 set id=1 ;  #把a1表的id项的数据全部变成1
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3  Changed: 2  Warnings: 0
mysql> select * from a1; #查看两个表,发现数据都进行了修改
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    1 | wangwu   |
|    1 | hehe     |
+------+----------+
3 rows in set (0.00 sec)
mysql> select * from aaa;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   18 |
|    1 | wangwu   |   19 |
|    1 | hehe     |   17 |
+------+----------+------+
3 rows in set (0.00 sec)

删除视图

mysql> drop view a1;  #删除视图
Query OK, 0 rows affected (0.00 sec)
mysql> show tables; #查看所有表,发现只剩下了原表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
+---------------+
1 row in set (0.00 sec)

三、触发器


(1)触发器概述


  • 触发器就是当指定的表发生了某个操作,那么就会自动执行预先编写好的SQL语句,有点像是条件
  • 触发器一般用于监视某种情况,并触发某个操作,保证数据的完整性,起到约束的作用
  • 触发器创建语法的四要素:


  1. 监视地点(table表)
  2. 监视事件(insert、update、delete)
  3. 触发事件(after、before)
  4. 触发事件(insert、update、delete)


注意!!!:触发器只能在两个表之间进行触发,也就是说,a表设置触发条件,b表设置触发操作


(2)触发器的使用


创建触发器


after为后置触发,及命令执行完后触发,before表示前置触发,及命令执行前触发


触发器的条件可以为delete、insert、update


for each row后面如果想写条触发语句那就写一个即可,写多条触发语句可以配合begin、end来执行,要记得修改结束符

mysql> create trigger a1 after delete on aaa for each row #设置触发器,当删除aaa表中的数据时,对bbb表进行操作
    -> insert into bbb values(1,"aaa",55);
Query OK, 0 rows affected (0.00 sec)
mysql> show tables; #查看所有表,发现没有bbb表
+---------------+
| Tables_in_aaa |
+---------------+
| aaa           |
+---------------+
1 row in set (0.00 sec)
mysql> create table bbb(id int,name char (10),age int); #创建bbb表
Query OK, 0 rows affected (0.15 sec)
mysql> delete from aaa where name="hehe"; #执行刚刚创建的触发器的条件,也就是删除aaa表的数据
Query OK, 1 row affected (0.00 sec)
mysql> select * from bbb; #这个时候查看bbb表,发现刚刚创建的bbb表有了新的数据,而这个数据就是触发语句插入的
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | aaa  |   55 |
+------+------+------+
1 row in set (0.00 sec)
mysql> show triggers\G; #查看所有的触发器
*************************** 1. row ***************************
             Trigger: a1
               Event: DELETE
               Table: aaa
           Statement: insert into bbb values(1,"aaa",55)
              Timing: AFTER
             Created: 2021-05-19 00:01:14.18
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
ERROR: 
No query specified
mysql> drop trigger a1; #删除触发器,指定触发器的名称
Query OK, 0 rows affected (0.00 sec)
mysql> show triggers\G; #再次查看,发现没有触发器了
Empty set (0.00 sec)
ERROR: 
No query specified


四、存储过程


(1)存储过程概述


  • 在进行mysql操作时,需要一条一条的输入SQL语句,而存储过程就像是写脚本一样,把多条SQL语句组成一个整体,一次性执行多条SQL语句,并且存储过程还可以写条件语句、循环语句等,可以多次执行


  • 优点:


存储过程增强了SQL语言的灵活性,配合控制语句编写,可以完成复杂的判断和较复杂的运算


减少网络流量,降低了网络负载,存储过程在创建成功后,想要执行的时候只需要调用存储过程即可,而传统的做法是使用SQL语句一个一个敲,通过网络发送给数据库服务然后再执行,这样耗费了网络资源


存储过程只是在编写时进行编译,以后每次执行存储过程都不需要编译,一般SQL语句每执行一次就编译一次,而存储过程只需要一次编译就可以多次使用


  • 缺点:


  1. 扩展功能不方便
  2. 不便于系统后期维护


(2)存储过程的使用


-创建不带参数的存储过程

mysql> delimiter $$ #先修改结束符
mysql> create procedure a1()  #创建存储过程
    -> BEGIN
    -> select * from aaa;
    -> END $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; #修改成;
mysql> call a1();  #执行存储过程
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   18 |
|    1 | wangwu   |   19 |
+------+----------+------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

-创建带参数的存储过程

mysql> delimiter $$  #修改结束符
mysql> create procedure a2(in i char(20)) #创建带参数的存储过程,a2(in i char(20))这个有点像是read -p交互式赋予变量,当执行这个存储过程时,可以输入指定的参数,char(20)就是输入参数的类型,i就像变量名一样,输入的参数就是变量值
    -> BEGIN
    -> select * from aaa where id=i; #写执行语句时可以结合上面的参数达到指定的效果
    -> END $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call a2(1); #执行a2参数,参数取值为1
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   18 |
|    1 | wangwu   |   19 |
+------+----------+------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> show procedure status like "%a1"\G; #查看指定的存储过程
*************************** 1. row ***************************
                  Db: aaa
                Name: a1
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2021-05-19 00:20:58
             Created: 2021-05-19 00:20:58
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
ERROR: 
No query specified

-删除存储过程


mysql> drop procedure a1; #删除指定存储过程
Query OK, 0 rows affected (0.00 sec)


-查看存储过程

mysql> show procedure status\G; #查看所有的存储过程,这样看特别乱,但是可以看到所有的存储过程
。。。。。。
mysql> show procedure status like "%a2"\G; #查看指定的存储过程
*************************** 1. row ***************************
                  Db: aaa
                Name: a2
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2021-05-19 00:45:16
             Created: 2021-05-19 00:45:16
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
ERROR: 
No query specified

除指定存储过程

Query OK, 0 rows affected (0.00 sec)

### -查看存储过程
```shell
mysql> show procedure status\G; #查看所有的存储过程,这样看特别乱,但是可以看到所有的存储过程
。。。。。。
mysql> show procedure status like "%a2"\G; #查看指定的存储过程
*************************** 1. row ***************************
                  Db: aaa
                Name: a2
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2021-05-19 00:45:16
             Created: 2021-05-19 00:45:16
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
ERROR: 
No query specified


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
存储 关系型数据库 MySQL
MySQL中的索引及怎么使用
综上所述,MySQL索引的正确使用是数据库性能调优的关键一环。通过合理设计索引结构,结合业务需求和数据特性,可以有效提升数据库查询响应速度,降低系统资源消耗,从而确保应用的高效运行。
10 1
|
6天前
|
存储 关系型数据库 MySQL
MySQL索引失效及避免策略:优化查询性能的关键
MySQL索引失效及避免策略:优化查询性能的关键
26 3
|
11天前
|
关系型数据库 MySQL 数据库
MySQL删除全局唯一索引unique
这篇文章介绍了如何在MySQL数据库中删除全局唯一的索引(unique index),包括查看索引、删除索引的方法和确认删除后的状态。
33 9
|
5天前
|
存储 SQL 关系型数据库
MySQL 的索引是怎么组织的?
MySQL 的索引是怎么组织的?
12 1
|
6天前
|
存储 关系型数据库 MySQL
MySQL索引的概念与好处
本文介绍了MySQL存储引擎及其索引类型,重点对比了MyISAM与InnoDB引擎的不同之处。文中详细解释了InnoDB引擎的自适应Hash索引及聚簇索引的特点,并阐述了索引的重要性及使用原因,包括提升数据检索速度、实现数据唯一性等。最后,文章还讨论了主键索引的选择与页分裂问题,并提供了使用自增字段作为主键的建议。
MySQL索引的概念与好处
|
6天前
|
监控 关系型数据库 MySQL
如何优化MySQL数据库的索引以提升性能?
如何优化MySQL数据库的索引以提升性能?
14 0
|
6天前
|
监控 关系型数据库 MySQL
深入理解MySQL数据库索引优化
深入理解MySQL数据库索引优化
12 0
|
19天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
20天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
160 11
|
16天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
58 13
MySQL的安装&数据库的简单操作
下一篇
无影云桌面