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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 SQL NoSQL
|
3月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
50 5
|
3月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
74 3
|
2月前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
3月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
89 1
|
3月前
|
存储 SQL 安全
|
3月前
|
存储 SQL 数据库
使用SQL创建视图和存储过程
使用SQL创建视图和存储过程
24 0
|
5月前
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
52 0
|
5月前
|
SQL 数据采集 关系型数据库
|
5月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
56 0

热门文章

最新文章