数据库 -- 视图

ops/2025/1/12 11:26:07/

1. 视图

1.1 什么是视图

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

2. 创建视图

语法:

CREATE VIEW view_name [(column_list)] AS select_statement
  • create view 关键字
  • view_name 视图名
  • [(column_list)] 视图中包含的列
  • select_statement 视图所依赖的查询语句

3. 使用视图

  • 首先构建一个用于视图的表格,如下:
#课程表
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);
  • 如查询同学的姓名和相应课程的分数,使用普通的联合查询语句如下:
# 查询所有同学每门课的成绩,及同学的姓名
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;

在这里插入图片描述

  • 但是我们不想让别人知道我们的表结构,和不想查询表时再写如此复杂的语句,此时我们就可以使用视图,视图语句如下:

错误示范:

# 设置查询所有同学每门课的成绩,及同学的姓名的视图
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;

在这里插入图片描述

  • 我们发现该语句会报一个重复列名的错误,我们建议在有相同的名字时,可以为查询结果的字段名起上别名

正确示范:

# 设置查询所有同学每门课的成绩,及同学的姓名的视图
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;

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

# 使⽤视图查询
select * from v_score_course_student;

我们发现普通的联合查询与视图查询结果是一样的。
在这里插入图片描述

  • 定义视图的好处有哪些
    1. 隐藏敏感字段
    在这里插入图片描述

2. 对外提供统一访问规范
在这里插入图片描述

4. 修改数据

  • 通过真实表修改数据,会影响视图
 # 修改唐三藏的JAVA成绩为99分
mysql> update score set score = 99 where student_id = 1 and course_id = 1;
//Query OK, 2 rows affected (0.01 sec)
//Rows matched: 2  Changed: 2  Warnings: 0# 查询视图,发现唐三藏这条记录已被修改
  • 通过视图修改数据会影响基表
# 修改唐三藏的计算机⽹络成绩为99分
mysql> update v_student_socre set score = 99 where score_id = 3;
# ERROR 1221 (HY000): Incorrect usage of UPDATE and ORDER BY
# 发现更新失败,因为创建视图时使⽤了order by 语句

注意事项
修改真实表会影响视图,修改视图同样也会影响真实表
以下视图不可更新:

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

5. 删除视图

语法:

drop view view_name;

在这里插入图片描述

6. 视图的优点

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

7. 视图的缺点

1. 性能: 从数据库查询数据可能会很慢,特别是如果视图是基于其他视图创建的,需要通过多次查询才能访问到数据
2. 表依赖关系: 每当更改与其相关表的结构时,都必须更改视图
3. 修改受到限制


http://www.ppmy.cn/ops/149432.html

相关文章

单片机实物成品-011 火灾监测

火灾监测(20个版本) 版本20: oled显示温湿度烟雾浓度火焰传感器天然气浓度窗户风扇水泵排气系统声光报警语音播报按键WIFI模块 ----------------------------------------------------------------------------- https://www.bilibili.com…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

Java 工厂模式、工厂方法模式、抽象工厂模式

Java 工厂模式、工厂方法模式、抽象工厂模式 引言 在软件开发中,设计模式是解决特定问题的通用解决方案。工厂模式作为一种创建型设计模式,在对象创建过程中扮演着重要角色。本文将详细介绍Java中的工厂模式,包括其概念、应用场景、实现方式…

Streamlit+Selenium快速构建一个网络爬虫应用

项目需要从网上爬取数据,用了八爪鱼来进行测试,可以通过自定义任务,不需要编程即可实现对于数据的爬取,但是缺点是免费版本自定义任务有数量限制,另外在采集过程的控制上还不够便利,对于熟悉Python编程的人…

uni-app的学习

uni-app 有着跨平台支持、丰富的插件和生态系统、高性能、集成开发工具HBuilderX的配合使用。允许使用者仅通过一套代码发布到多平台使用。 uni-app官网 uni-app 是一个适合开发跨平台移动应用和小程序的框架,能够大幅提高开发效率。 一、了解 1.1 工具准备 从Git…

数据开发八股文整理- Hadoop

什么是hadoop Hadoop是一个分布式系统基础架构,主要解决海量数据的存储和海量数据的分析计算问题 Hadoop运行模式 本地模式和为分布式模式都是单机运行 完全分布模式即是多台服务器组成分布式环境 Hadoop集群中的组件 Name Node-负责存储文件的元数据,例…

vue3树形组件+封装+应用

文章目录 概要应用场景代码注释综合评价注意事项功能拓展代码说明概要 创建一个基于Vue 3的树形结构组件,用于展示具有层级关系的数据,并提供了节点展开/折叠、点击等交互功能。以下是对其应用场景、代码注释以及综合评价和注意事项的详细说明。 应用场景 这个组件适用于需…

Spring Boot 和微服务:快速入门指南

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…