视图20221027

本文深入探讨了SQL Server中的视图概念,视图作为虚拟表,不存储数据但简化查询并减少数据冗余。介绍了如何创建和查看视图,包括单表和多表视图的创建,以及查看视图的不同方法。同时,文章详细阐述了更新视图数据的规则和限制,并讨论了不能更新视图数据的场景。最后,提到了修改视图的两种方式,强调视图主要用于查询,而非频繁更新,更新视图数据实际上是操作基表。
摘要由CSDN通过智能技术生成

一. 视图的理解

  • 视图,可以看成是一个虚拟表,本身是不存储数据的。视图的本质,就可以看做是存储起来的SELECT语句
  • 视图中SELECT语句中涉及到的表,称为基表
  • 针对视图做DML操作,会影响到对应的基表中的数据。反之亦然。
  • 视图本身的删除,不会导致基表中数据的删除。
  • 视图的应用的场景:针对小型项目,不推荐使用视图。针对大型项目,可以考虑使用视图。
  • 视图的优点:
    • 简化查询;
    • 减少数据冗余
    • 数据安全
    • 适应灵活多变的需求
    • 能够分解复杂多变的查询逻辑
  • 使徒的缺点:
    • 如果实际的数据表结构变了,我们就需要及时的对相关的视图进行相应的维护

二. 创建和查看视图

2.1 创建视图

前期准备

########## 准备工作

CREATE DATABASE dbtest14;

USE dbtest14;

# 创建员工表
CREATE TABLE emps
AS 
SELECT * 
FROM atguigudb.`employees`;

# 创建部门表
CREATE TABLE depts
AS SELECT * 
FROM atguigudb.`departments`;


DESC emps;		# 直接复制过来的表,实际上数据复制过来了,但是(非空约束以及主键关系)没有被复制过来
SELECT * FROM emps;

DESC depts;
SELECT * FROM depts;

针对单表创建视图

#情况1:视图中的字段和基表中的字段有对应的关系

## 例子1 
CREATE VIEW vu_emp1 
AS 
SELECT employee_id,last_name,salary
FROM emps;

SELECT * 
FROM vu_emp1; 

## 例子2 
CREATE VIEW vu_emp2
AS 
SELECT employee_id emp_id, last_name lname, salary
FROM emps
WHERE salary > 8000;

SELECT * 
FROM vu_emp2; 

## 例子3 
CREATE VIEW vu_emp3(emp_id, lname, monthly_salary)  # 小括号中的字段因该和select语句中的对应字段一一匹配
AS 
SELECT employee_id, last_name, salary
FROM emps
WHERE salary > 8000;

SELECT * 
FROM vu_emp3;


# 情况2:视图中的字段在基表中可能没有对应的字段
## 例子4
CREATE VIEW vu_emp_sal 
AS 
SELECT department_id, AVG(salary) avg_sal   # 这里有聚合函数,不会存储聚合函数的数据的
FROM emps
WHERE department_id IS NOT NULL
GROUP BY department_id;

SELECT * 
FROM vu_emp_sal; 

针对多表创建视图

CREATE VIEW vu_emp_dept
AS
SELECT e.employee_id,d.department_id,d.department_name
FROM emps e JOIN depts d
ON e.`department_id` = d.`department_id`;

SELECT * FROM vu_emp_dept;



# 利用视图进行格式化
CREATE VIEW vu_emp_dept1
AS
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.`department_id` = d.`department_id`;

SELECT * FROM vu_emp_dept1;

2.2 查看视图

语法1:

  • 查看数据库的表对象、视图对象
SHOW TABLES;

语法2:

  • 查看视图结构
DESCRIBE vu_emp1;

语法3:

  • 查看视图的属性信息
SHOW TABLE STATUS LIKE 'vu_emp1';

语法4:

  • 查看视图的详细信息
SHOW CREATE VIEW vu_emp1;

三. 更新视图的数据与视图的删除

3.1 更新视图中的数据

查看视图vu_emp1和表emps的原始数据

SELECT * FROM vu_emp1; 

SELECT employee_id,last_name,salary
FROM emps;

在这里插入图片描述

将vu_emp1中,employee_id=101的数据salary修改为20000: (通过修改视图来实现)

UPDATE vu_emp1
SET salary=20000
WHERE employee_id = 101

SELECT * FROM vu_emp1; 

SELECT employee_id,last_name,salary
FROM emps;

在这里插入图片描述
将vu_emp1中,employee_id=101的数据salary修改为20000: (通过修改表中数据来实现)

UPDATE emps
SET salary = 10000
WHERE employee_id = 101;

SELECT * FROM vu_emp1; 

SELECT employee_id,last_name,salary
FROM emps;

在这里插入图片描述
总结:

  • 1. 更新视图的数据,会导致表中数据的修改
  • 2. 更新表中的数据,会导致视图中数据的修改

3.2 不能更新视图中的数据场景

  • 总之,要完成视图的更新,必须保证视图中的行和底层表中的行之间存在一对一的关系。
  • 另外,当视图定义出现如下情况时,视图不支持更新操作:
    在这里插入图片描述
    总结:
  • 1. 虽然可以更新试图数据,但是总的来说,视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。
  • 2. 对视图数据的更改,都是通过对实际的数据表里的操作来完成的。

4. 修改视图

4.1 方式1:

CREATE OR REPLACE VIEW vu_emp1
AS 
SELECT employee_id,last_name,salary,email
FROM emps
WHERE salary > 7000;

4.2 方式2:

ALTER VIEW vu_emp1
AS 
SELECT employee_id,last_name,salary,email,hire_date
FROM emps
WHERE salary > 7000;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Martin__Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值