【MySQL】视图

一、基本概念

1、怎么理解视图

  • 视图是一个或多个数据表中的数据的逻辑显示,它是一个虚拟表,视图本身并不存储数据
  • 视图建立在已有表的基础上,它所依赖的表称为基表
  • 视图的创建和删除只影响视图本身,不影响基表,但是视图中数据增删改操作,会影响到基表中的数据
  • 向视图提供数据内容的语句为select语句,可以将视图理解为将某个select语句的查询结果存储起来了,并且我们还能通过对视图进行增删改操作来影响基表中的数据
  • 在大型项目或者数据比较复杂的情况下,使用视图可以把我们经常查询的字段存储到虚拟表中,大大提高了查询效率

2、为什么使用视图

  • 视图一方面可以帮我们使用表的一部分,而不是整个表
  • 另外我们可以针对不同级别的用户制定不同的查询视图。比如员工信息表中,某些级别比较低的员工,就看不到薪资和员工评级等敏感信息,这个时候就需要使用视图来完成这个操作了

3、视图的优点与缺点

  • 优点:
    • 简化操作:某些经常使用的查询操作可以定义为视图,业务只需要对视图进行操作即可
    • 减少数据冗余:视图本身并不存储数据,它是一个虚拟表,不占用存储数据的资源
    • 数据安全:可以让不同权限的用户看见不同的结果集
    • 能够分解复杂的逻辑:将复杂的问题进行拆解,变成一个个视图,然后在这些视图的基础上进行整合
  • 缺点:
    • 视图维护比较麻烦
    • 如果是嵌套视图,可读性比较差

二、视图的创建与查看

1、如何创建视图

sql 复制代码
CREATE VIEW 视图名称
AS
SELECT查询语句;

1)单表查询如何创建视图

情况一:视图中的字段与基表的字段有对应关系,假设我们要从员工表中查询某些字段作为视图

sql 复制代码
# 查询语句中的字段别名,会作为视图中的字段进行展示
CREATE VIEW vu_emp
AS
SELECT employee_id emp_id,last_name lname,salary
FROM t_employee;

# 小括号内的字段个数与SELECT中字段个数相同,小括号内的别名作为视图展示字段
CREATE VIEW vu_emp2(emp_id,lname,salary)
AS
SELECT employee_id,last_name,salary
FROM t_employee
WHERE salary > 8000;

情况二:视图中的字段在基表中没有对应字段,比如要将某个字段的平均值作为视图的字段

sql 复制代码
CREATE VIEW vu_emp3
AS
SELECT dept_id,AVG(salary) avg_salary
FROM t_employee
WHERE department_id IS NOT NULL
GROUP BY dept_id;

2)多表查询如何创建视图

sql 复制代码
CREATE VIEW vu_emp_dept
AS
SELECT e.emp_id,e.dept_id,d.dept_name
FROM t_employee e JOIN t_dept d
ON e.dept_id = d.dept_id;

3)使用视图对数据进行格式化

假设我们要查询员工表中的员工名称,并且在后面追加他的部门id

得到员工名称(部门id)这种形式的数据

sql 复制代码
CREATE VIEW vu_emp_dept_info
AS
SELECT CONCAT(last_name,'(',emp_id,')') emp_dep_info
FROM
t_dept;

4)基于视图创建视图

sql 复制代码
CREATE VIEW vu_dept_info
AS
SELECT dept_id,dept_name
FROM vu_emp_dept;

基于多个视图进行多表查询也是和上面表的多表查询也是一样的思路,都是使用JOIN关键字

2、查看视图

sql 复制代码
# 查看数据库中有多少表和视图
SHOW TABLES;

#查看视图的结构
DESC 视图名称;

#查看视图的详细信息
SHOW CREATE VIEW 视图名称;

3、更新与删除视图数据

  • 更新或者删除视图中的某部分数据,会同步影响基表中展示的数据。同理,更新或者删除基表中的部分数据,也会同步影响相关视图中展示的数据
  • 假设视图中的字段在基表中不存在,例如视图中某个字段是对基表中某个字段使用聚合函数得到的,我们无法对其进行更新或者删除,就像下方的avg_salary
sql 复制代码
CREATE VIEW vu_emp3
AS
SELECT dept_id,AVG(salary) avg_salary
FROM t_employee
WHERE department_id IS NOT NULL
GROUP BY dept_id;
  • 视图主要是为了方便我们对数据进行查询,假设我们要对数据进行修改,那还是建议操作基表

4、修改与删除视图

1)使用CREATE OR REPLACE

假设我们需要在下面的视图中再增加一个email字段

sql 复制代码
CREATE VIEW vu_emp
AS
SELECT employee_id,last_name,salary
FROM t_employee
WHERE salary > 8000;

就可以使执行如下sql

sql 复制代码
CREATE OR REPLACE VIEW vu_emp
AS
SELECT employee_id,last_name,salary,email
FROM t_employee
WHERE salary > 8000;

2)使用ALTER VIEW,想达到上面那样的效果,就执行如下sql

sql 复制代码
ALTER VIEW vu_emp
AS
SELECT employee_id,last_name,salary,email
FROM t_employee
WHERE salary > 8000;

3)删除视图,IF EXISTS可带可不带

sql 复制代码
DROP VIEW IF EXISTS 视图名称;

另外,如果视图C是基于视图A与视图B创建的,当A与B被删除时,视图C会出现查询失败的情况

如有错误,欢迎指正!!!

相关推荐
Auc244 分钟前
使用scrapy框架爬取微博热搜榜
开发语言·python
中草药z6 分钟前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
地球资源数据云7 分钟前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
QQ同步助手11 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
凯子坚持 c17 分钟前
仓颉编程语言深入教程:基础概念和数据类型
开发语言·华为
小爬虫程序猿20 分钟前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
程序猿-瑞瑞22 分钟前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm
qq_4335545422 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
组合缺一25 分钟前
Solon v3.0.5 发布!(Spring 可以退休了吗?)
java·后端·spring·solon
猿来入此小猿29 分钟前
基于SpringBoot在线音乐系统平台功能实现十二
java·spring boot·后端·毕业设计·音乐系统·音乐平台·毕业源码