[MySQL] 数据库-视图

什么是视图

  • 视图通过以定制的方式显示来自一个或多个表的数据
  • 视图是一种数据库对象(可以使用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;            -- 单表查询

执行结果为:

 

视图的使用规则

  1. 视图必须有唯一的命名
  2. 在MySQL中视图的数量没有限制
  3. 创建视图必须从管理员那里获得有必要的权限
  4. 视图支持嵌套,也就是说可以利用其它视图检索出来的数据创建新的视图
  5. 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的ORDER BY
  6. 视图不能索引,也不能关联触发器或者默认值(视图本质上不是一张表)
  7. 视图可以和表同时使用

修改视图

使用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 视图名称;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值