什么是视图
- 视图通过以定制的方式显示来自一个或多个表的数据
- 视图是一种数据库对象(可以使用create关键字创建视图),用户可以像查询普通表一样查询视图
- 视图内其实没有存储任何数据,它只是对表的一个查询(视图里存放的只是SQL语句,并不是结果。原因是因为,当对之前的SQL语句进行了修改时,如果视图存储的时执行结果(结果并不会改变),那么结果将于改变之后的SQL语句会有冲突)
- 视图的定义保存数据字典内,创建视图所基于对表称为“基表”
为什么需要视图
如果经常要对两个表进行连接查询,每次都要做表的连接,写同样的一串语句,同时由于部分信息可能比较敏感不想让普通用户看到。这样的情况下我们就可以通过视图来解决。
视图的作用和有点
作用:
- 控制安全
- 保存查询数据
有点:
- 提供了灵活一致级别安全性
- 隐藏了数据的复杂性
- 简化了用户的SQL指令
- 通过重命名列,从另一个角度提供数据
环境准备:
# 创建部门表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20)
);
# 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dep_id INT,
FOREIGN KEY (dep_id) REFERENCES dept(did) -- 外键,关联部门表(部门表的主键)
);
-- 添加部门数据
INSERT INTO dept (dNAME) VALUES ('研发部'),('市场部'),('财务部'),('销售部');
-- 添加员工数据
INSERT INTO emp(NAME,gender,salary,join_date,dep_id) VALUES
('孙悟空','男',7200,'2013-02-24',1),
('猪八戒','男',3600,'2010-12-02',2),
('唐僧','男',9000,'2008-08-08',2),
('白骨精','女',5000,'2015-10-07',3),
('蜘蛛精','女',4500,'2011-03-14',1),
('小白龙','男',2500,'2011-02-14',null);
创建视图
视图的本质是SQL指令(select语句),基本语法:
CREATE VIEW 视图名称 AS SQL语句;
当我们只想给普通用户展示员工的姓名和员工所在的部门,其他信息都隐藏时我们可以这样写:
select
emp.name 员工的性名, dept.d_name 所在部门
from
emp,dept
where
emp.dep_id = dept.d_id;
执行结果:
通过上面对视图分析,相信大家语句对视图有了一定的了解。视图就是一张虚拟表,当我们想要将上面两张表的查询结果变成一张表的话,这时我就可以用到视图,语句如下
create view v_emp_dept
as
(select emp.name 员工的性名, dept.d_name 所在部门 from emp,dept where emp.dep_id = dept.d_id);
使用视图
视图是一张虚拟表,可以直接把视图当做”表”操作,但是视图本身没有数据,是临时执行select语句得到对应的结果,视图主要用作查询操作. 基本语法
select 字段列表 from 视图名字 [子句];
查询v_emp_dept视图
SELECT * FROM v_emp_dept; -- 单表查询
执行结果为:
视图的使用规则
- 视图必须有唯一的命名
- 在MySQL中视图的数量没有限制
- 创建视图必须从管理员那里获得有必要的权限
- 视图支持嵌套,也就是说可以利用其它视图检索出来的数据创建新的视图
- 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的ORDER BY
- 视图不能索引,也不能关联触发器或者默认值(视图本质上不是一张表)
- 视图可以和表同时使用
修改视图
使用CREATE OR REPLACE VIEW 语句修改v_emp_dept视图. 为每个列指定列名.
create
or replace
view v_emp_dept
as
(select emp.id, emp.name 员工的性名, dept.d_name 所在部门 from emp,dept where emp.dep_id = dept.d_id);
-- 查询视图
SELECT * FROM v_emp_dept;
执行结果:
在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名使用ALTER VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.
alter view v_emp_dept
(编号, 工资, 姓名, 部门)
as (select emp.id, emp.salary, emp.name , dept.d_name
from emp,dept
where
emp.dep_id = dept.d_id);
-- 查询视图
SELECT * FROM v_emp_dept;
执行结果:
注意:不建议对视图数据进行增删改。万一一定要修改,本质修改的是表的结构
删除视图
删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.
DROP VIEW 视图名称;