(MySQL)视图

注:此博文是本人学习过程中的笔记

1.概念

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

2.创建视图

sql 复制代码
-- 语法
CREATE VIEW view_name [(column_list)] AS select_statement;

3.使用视图

查询用户的所有信息和考试成绩

sql 复制代码
-- 使用真实表进行查询
select
s.id, s.name, s.sno, s.age, s.gender, s.enroll_date, 
c.id, c.`name`, 
sc.id, sc.score
from student s, class c, score sc
where s.class_id = c.id
and sc.student.id = s.id
and sc.course_id = co.id
order by s.id;

-- 创建视图,在select中使用别名
create view v_student_score as
select s.id, s.name, s.sno, s.age, s.gender, s.enroll_date, 
c.id as class_id, c.`name` as class_name, 
co.id as course_id, co.`name` as course_name, sc.id as score_id, sc.score
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id
order by s.id;

-- 创建视图,指定结果集中的列名
create view v_student_score_v1
(id, name, sno, age, gender, enroll_date,
class_id, class_name, 
course_id, course_name, score_id, score) as
select s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
c.id, c.`name`, 
co.id, co.`name`, 
sc.id, sc.score
from student s, class c, course, co, score sc
where s.class_id = c.id
and sc.student_id = s.id
and sc.course_id = co.id;

-- 查询视图
select * from v_student_score;
select * from v_student_score_v1;

查询用户的姓名和总分(隐藏学号和各科成绩)

sql 复制代码
-- 使用真实表进行查询
select s.name, sum(sc.score) total 
from student s, score sc
where s.id = sc.student_id
group by sc.student.id 
order by s.id;
-- 如果使用真实表,在查询列表中随时可以加上学号字段

-- 创建视图
create view v_student_total_points as
select s.id, s.name, sum(sc.score) total
from student s, score sc
where s.id = sc.student_id
group by s.id
order by s.id;
-- 使用视图查询,只能查到学生姓名和总分,不能再添加查询字段 

视图和真实表进行表连接查询

sql 复制代码
select * from v_student_total_points v, student s, where v.id = s.id;

4.修改数据

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

sql 复制代码
-- 修改唐三藏的JAVA成绩为99分
update score set score = 99 where student_id = 1 and course_id;

-- 查询视图,发现唐三藏这条记录已被修改
select * from v_student_score;

通过视图修改数据会影响基表

sql 复制代码
-- 修改唐三藏的计算机网络成绩为99分
update v_student_score set score = 99 where score_id = 3;

-- 查看真实表数据已被修改
select * from score where student_id = 1 and course_id = 5;

4.1.注意事项

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

2.以下视图不可更新

创建视图时使用聚合函数

创建视图时使用distinct

创建视图时使用group by以及having子句

创建视图时使用union或union all

查询列表中使用子查询

在from子句中引用不可更新视图

5.删除视图

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

6.视图的优点

1.简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需要查询视图而无需了解底层的复杂逻辑

2.安全性:通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表

3.逻辑数据独立性:视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的引用程序。使用到应用程序与数据库的解耦

4.重命名列:视图允许用户重命名列名,以增强数据可读性

相关推荐
陈卓4105 分钟前
MySQL-主从复制&分库分表
android·mysql·adb
IT项目管理38 分钟前
达梦数据库DMHS介绍及安装部署
linux·数据库
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
大春儿的试验田1 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
Ein hübscher Kerl.1 小时前
虚拟机上安装 MariaDB 及依赖包
数据库·mariadb
长征coder2 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
醇醛酸醚酮酯2 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
ladymorgana2 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui2 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
GreatSQL社区3 小时前
用systemd管理GreatSQL服务详解
数据库·mysql·greatsql