注:此博文是本人学习过程中的笔记
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.重命名列:视图允许用户重命名列名,以增强数据可读性