视图
一. 视图的理解
- 视图,可以看成是一个虚拟表,本身是不存储数据的。视图的本质,就可以看做是存储起来的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;