二、视图
(1)视图概述
- 视图是一个虚拟表,内容由查询定义,和真实的表一样,视图包含一系列带有名称的列和行数据
- 视图的作用就是缓存数据,当用户把一个SQL语句的查询结构保存到视图里后,下次查询只需要访问视图就可以,无需再次使用SQL语句进行筛选,并且修改视图会修改原表的数据
- 视图的特点:
- 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新表
- 视图是由基本表(真表)产生的表(虚表)
- 视图的建立和删除不影响原表
- 对视图内容的修改、删除、插入会对原表产生直接影响,会直接修改原表
- 当视图的数据是来自多个表时,是不允许修改视图的数据的
(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语句,有点像是条件
- 触发器一般用于监视某种情况,并触发某个操作,保证数据的完整性,起到约束的作用
- 触发器创建语法的四要素:
- 监视地点(table表)
- 监视事件(insert、update、delete)
- 触发事件(after、before)
- 触发事件(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语句每执行一次就编译一次,而存储过程只需要一次编译就可以多次使用
- 缺点:
- 扩展功能不方便
- 不便于系统后期维护
(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