MySQL之视图

在前面我们了解过联合查询,有时候需要牵扯多张表,我们想是否可以把常用的,繁琐的查询语句重新定义一下,假设不知道表结构的人,是否也可以查询呢?今天我们来一探究竟------>《视图》

1. 什么是视图?

视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数据,⽽是通过执⾏查询来动态⽣成数据。用户可以像操作普通表⼀样使用视图进行查询、更新和管理。视图本⾝并不占⽤物理存储空间,它仅仅是⼀个查询的逻辑表示,物理上它依赖于基础表中的数据。

2. 创建视图

sql 复制代码
# 语法
CREATE VIEW view_name [(column_list) AS 别名] AS select_statement

3. 使用视图

与上文《MySQL联合查询》一样,构建一样的用于示例的表格,如下:

sql 复制代码
#课程表
create table course(
id bigint PRIMARY KEY auto_increment,
name varchar(10)
);
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计算机⽹络'), ('数据结构');

# 班级表
create table class (
id bigint,
name varchar(20)
);
insert into class  value (1,'软件1班'),(2,'软件2班'),(3,'软件3班');

drop table student;
#学生表
create table student (
id bigint,
name varchar(20),
sno varchar(10),
age int,
gender boolean,
enroll_date date,
class_id bigint
);
insert into student (id,name, sno, age, gender, enroll_date, class_id) values
(1,'唐三藏', '100001', 18, 1, '1986-09-01', 1),
(2,'孙悟空', '100002', 18, 1, '1986-09-01', 1),
(3,'猪悟能', '100003', 18, 1, '1986-09-01', 1),
(4,'沙悟净', '100004', 18, 1, '1986-09-01', 1),
(5,'宋江', '200001', 18, 1, '2000-09-01', 2),
(6,'武松', '200002', 18, 1, '2000-09-01', 2),
(7,'李逹', '200003', 18, 1, '2000-09-01', 2),
(8,'不想毕业', '200004', 18, 1, '2000-09-01', 2);

#成绩表
create table score (
score double,
student_id varchar(10),
course_id bigint
);
insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

例如查询同学的姓名和相应课程的分数,使用普通的联合查询语句如下:

sql 复制代码
# 查询所有同学每门课的成绩,及同学的姓名
select s.name , sc.score,c.name from student s , score sc ,course c 
where s.id=sc.student_id and sc.course_id=c.id;

我们不想要其他人了解我们的表结构,还有不想再使用这么复杂的语句,此时我们就可以使用视图,视图语句如下:

错误示例:

sql 复制代码
# 设置查询所有同学每门课的成绩,及同学的姓名的视图
create view v_score_course_student AS select s.name , sc.score,c.`name`  from student s , score sc ,course c 
where s.id=sc.student_id and sc.course_id=c.id;

可是我们发现上述视图,报了一个重复列明的错误,我们建议在有相同的名字时,可以为查询结果的字段名起上别名

正确示例:

sql 复制代码
# 设置查询所有同学每门课的成绩,及同学的姓名的视图
create view v_score_course_student AS select s.name as 姓名 , sc.score,c.`name` as 课程名 from student s , score sc ,course c 
where s.id=sc.student_id and sc.course_id=c.id;

创建好了视图之后,我们同样可以使用查询语句来查询视图:

sql 复制代码
# 使⽤视图查询
select * from v_score_course_student;

我们发现使用视图的查询结果和联合查询的结果一样

4. 修改数据

  • 通过真实表修改数据,会影响视图
  • 通过视图修改数据会影响基表

4.1 注意事项

修改真实表会影响视图,修改视图同样也会影响真实表

以下视图不可更新:

  • 创建视图时使用聚合函数的视图
  • 创建视图时使用 DISTINCT
  • 创建视图时使用 GROUP BY 以及 HAVING 子句
  • 创建视图时使用 UNIONUNION ALL
  • 查询列表中使用子查询
  • 在FROM子句中引用不可更新视图

5. 删除视图

sql 复制代码
# 语法
drop view view_name;

6. 视图的优点

  1. 简单性:视图可以将复杂的查询封装成⼀个简单的查询。例如,针对⼀个复杂的多表连接查询,可以创建⼀个视图,用户只需查询视图⽽⽆需了解底层的复杂逻辑。
  2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的用户表中,可以创建⼀个不包含密码列视图,普通用户只能访问这个视图,⽽不能访问原始表。
  3. 逻辑数据独立性 :视图提供了⼀种逻辑数据独立性,即使底层表结构发⽣变化,只需修改视图定义,⽽⽆需修改依赖视图的应⽤程序。使用到应用程序与数据库的解耦
  4. 重命名列:视图允许用户重命名列名,以增强数据可读性。

7. 视图的缺点

  1. 性能: 从数据库查询数据可能会很慢,特别是如果视图是基于其他视图创建的,需要通过多次查询才能访问到数据
  2. 表依赖关系: 每当更改与其相关表的结构时,都必须更改视图
  3. 修改收到限制
相关推荐
子木鑫1 分钟前
[SUCTF 2019] CheckIn1 — 利用 .user.ini 与图片马构造 PHP 后门并绕过上传检测
android·开发语言·安全·php
MMMMMMMMMMemory1 分钟前
社区版oceanbase报警XA事务悬挂
数据库·oceanbase
风清云淡_A3 分钟前
【ANDROID】使用webview实现加载第三方的网页效果
android
OceanBase数据库官方博客3 分钟前
APQO自适应参数化查询优化框架——OceanBase 校企联合研究成果
数据库·oceanbase·分布式数据库
Aloudata5 分钟前
破解监管溯源难题:从表级血缘到算子级血缘的数据治理升级
数据库·数据挖掘·数据治理·元数据·数据血缘
OceanBase数据库官方博客7 分钟前
中国联通软研院基于OceanBase引领运营商数智化转型新范式
数据库·oceanbase·分布式数据库
qq_297574679 分钟前
MySQL迁移到瀚高数据库 常用转换函数对照表(附XML示例,直接复用)
xml·数据库·mysql
筷乐老六喝旺仔10 分钟前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
吴声子夜歌11 分钟前
RxJava——操作符详解(四)
android·echarts·rxjava
想做一只开心的菜鸡11 分钟前
DARTS#02 | 从共识算法到存算分离:深度拆解云原生数据库的稳定性基石
数据库