0) 准备环境

  1. -- auto-generated definition
  2. create table city
  3. (
  4. city_id int auto_increment primary key,
  5. city_name varchar(30) not null,
  6. country_id int not null
  7. )
  8. 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;

image.png

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;

image.png

修改视图中的数据

update view_city_country set city_name = '青岛市' where country_name='山东';

源表数据也会跟着更新。
image.png

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;

知识点

  • 修改视图上的数据,源表上的数据将会被修改。