0) 准备环境
-- auto-generated definitioncreate table city(city_id int auto_increment primary key,city_name varchar(30) not null,country_id int not null)charset = utf8;
create database demo_01 default charset=utf8mb4;
use demo_01;
create table city (
`city_id` int(11) not null auto_increment,
`city_name` varchar(30) not null,
`country_id` int(11) not null,
primary key (`city_id`)
) engine=InnoDB default charset=utf8;
create table country (
country_id int not null auto_increment primary key,
country_name varchar(30) not null
)
charset=utf8;
insert into city (`city_name`,`country_id`) values ('郑州',1);
insert into city (`city_name`,`country_id`) values ('开封',1);
insert into city (`city_name`,`country_id`) values ('青岛',2);
insert into city (`city_name`,`country_id`) values ('合肥',3);
insert into country (`country_name`) values ('河南');
insert into country (`country_name`) values ('山东');
insert into country (`country_name`) values ('安徽');
1)视图概述
视图view 是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时,动态生成的。
:::info 视图就是一条select语句执行后返回的结果集。 :::
视图 VS 普通的表(优势)
- 简单:使用视图的用户完全不需要关系后面对应的表的结构、关联条件和筛选条件。对用户来说已经是过滤好的符合条件的结果集。
- 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单实现。
- 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
2)创建/修改/删除 视图
2.1)创建语法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例子:
select a.* ,b.country_name from city as a,country as b
where a.country_id=b.country_id;
create view view_city_country as
select a.city_name ,b.country_name from city as a,country as b
where a.country_id=b.country_id;
修改视图中的数据
update view_city_country set city_name = '青岛市' where country_name='山东';
源表数据也会跟着更新。
2.2)修改语法
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
## 选项
WITH [CASCADED | LOCAL] CHECK OPTION 决定了是否允许更新数据使记录不再满足视图的条件。
LOCAL : 只要满足本视图的条件就可以更新。
CASCADED : 必须满足所有针对该视图的所有视图的条件才可以更新。
2.3)删除视图
DROP VIEW [IF EXISTS] view_name [,view_name] ... [RESTRICT | CASCADE]
例子,删除视图view_city_country:
DROP VIEW view_city_country;
2.4)查看视图
## 查看普通表和视图,且不存在show views语句
show tables;
## 查看某个视图的DDL
show create view view_city_country;
知识点
- 修改视图上的数据,源表上的数据将会被修改。

