• 第14章_视图


    1. 常见的数据库对象

    2. 视图概述

    2.1 为什么使用视图?

    视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。 

    2.2 视图的理解
    • 1.视图的理解
        1.视图,就是一个虚拟表,本身不存储数据,
        视图的本质就是看作储存起来的select语句 
         
        2。视图中select语句涉及到的表,称作基表
        
        3.针对视图DML操作(增删改),会直接影响到对应的基表
        4.视图本身的删除,不会影响基表数据的删除
        
        5. 视图的应用场景:小型项目,不推荐使用视图。大型项目,可以推荐使用
        
        6.视图的优点:简化查询:控制访问   

     3. 创建视图

    1. CREATE [OR REPLACE]
    2. [ALGORITHM = {UNDEFINED | MERGE|TEMPTABLE}]
    3. VIEW 视图名称 [(字段列表)]
    4. AS 查询语句
    5. [WITH [CASCADED|LOCAL] CHECK OPTIO
    1. CREATE VIEW 视图名称
    2. AS 查询语句
    3.1 创建单表视图
    1. #情况1:视图中的字段与原表中的字段有对应的关系
    2. CREATE VIEW vu_emp1
    3. AS
    4. SELECT employee_id,last_name,salary
    5. FROM emps;
    6. SELECT *FROM vu_emp1;
    1. #确定视图字段名方式1
    2. CREATE VIEW vu_emp2
    3. AS
    4. SELECT employee_id emp_id,last_name lname,salary #查询语句字段的别名会作为视图字段名称出现
    5. FROM emps
    6. WHERE salary >8000;
    7. SELECT *FROM vu_emp2;
    8. #确定视图字段名方式2
    9. CREATE VIEW vu_emp3(emp_id,NAME,monthal_sal)#括号里的字段和查询的字段一一匹配
    10. AS
    11. SELECT employee_id,last_name,salary
    12. FROM emps
    13. WHERE salary >8000;
    14. SELECT *FROM vu_emp3;

    1. #情况2:视图中的字段与原表没有对应关系
    2. CREATE VIEW vu_sal
    3. AS
    4. SELECT department_id,AVG(salary) avg_sal
    5. FROM emps
    6. WHERE department_id IS NOT NULL
    7. GROUP BY department_id
    8. SELECT *FROM vu_sal;

    3.2 创建多表联合视图
    1. #2.2 针对多表
    2. CREATE VIEW vu_emp_dept
    3. AS
    4. SELECT e.employee_id,e.department_id,d.department_name
    5. FROM emps e JOIN depts d
    6. ON e.department_id =d.department_id;
    7. SELECT *FROM vu_emp_dept;

    #利用视图对数据进行格式化 

    1. #利用视图对数据进行格式化
    2. CREATE VIEW vu_emp_depart
    3. AS
    4. SELECT CONCAT(last_name,'(',d.department_name,')') emp_info
    5. FROM emps e JOIN depts d
    6. ON e.department_id =d.department_id;
    7. SELECT *FROM vu_emp_depart;
    3.3 基于视图创建视图
    1. 2.3 基于视图来创建视图
    2. CREATE VIEW vu_emp4
    3. AS
    4. SELECT employee_id,last_name
    5. FROM vu_emp1;
    6. SELECT *FROM vu_emp4;

    4. 查看视图

    1. 语法1:查看数据库的表对象,视图对象
    2. SHOW TABLES ;
    3. #语法2:查看视图的结构
    4. DESC vu_emp4;
    5. #语法3;查看视图的属性信息
    6. SHOW TABLE STATUS LIKE 'vu_emp4';
    7. #语法4:查看视图的详细定义信息
    8. SHOW CREATE VIEW vu_emp4;

    5. 更新视图的数据

    1. 4.1 一般情况下
    2. SELECT *FROM vu_emp1;
    3. SELECT employee_id,last_name,salary
    4. FROM emps;
    5. #更新视图的数据,同步更改表中的数据
    6. UPDATE vu_emp1
    7. SET salary=20000
    8. WHERE employee_id=101;
    9. #更新表中的数据,会同步更改视图中的数据
    10. UPDATE emps
    11. SET salary=10000
    12. WHERE employee_id=101;
    13. #删除视图中的数据
    14. DELETE FROM vu_emp1
    15. WHERE employee_id=101;
    5.2 不可更新的视图
    1. #4.2不能更新视图的情况
    2. SELECT *FROM vu_sal;
    3. #更新失败
    4. UPDATE vu_sal
    5. SET avg_sal =5000
    6. WHERE department_id=30;
    7. #删除失败
    8. DELETE FROM vu_sal
    9. WHERE department_id=30;
    • 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作
    • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
    • 在定义视图的SELECT语句中使用了 JOIN联合查询 ,视图将不支持INSERT和DELETE操作;
    • 在定义视图的SELECT语句后的字段列表中使用了数学表达式 或子查询 ,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值
    • 在定义视图的SELECT语句后的字段列表中使用 DISTINCT 、聚合函数 、 GROUP BY 、 HAVING 、UNION等,视图将不支持INSERT、UPDATE、DELETE;
    • 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERT、UPDATE、DELETE
    • 视图定义基于一个不可更新视图 ;

    6. 修改、删除视图

    6.1 修改视图
    1. 5.修改视图
    2. SELECT *FROM vu_emp1;
    3. #方式1
    4. CREATE OR REPLACE VIEW vu_emp1
    5. AS
    6. SELECT employee_id,last_name,salary,email
    7. FROM emps
    8. WHERE salary>7000;
    9. #方式2
    10. ALTER VIEW vu_emp1
    11. AS
    12. SELECT employee_id,last_name,salary
    13. FROM emps
    6.2 删除视图
    1. #6.删除视图
    2. SHOW TABLES;
    3. DROP VIEW vu_emp4;
    4. DROP VIEW IF EXISTS vu_emp2;

    7. 总结

    1. 操作简单
    2. 减少数据冗余
    3. 数据安全
    4. 适应灵活多变的需求
    5. 能够分解复杂的查询逻辑
    7.2 视图不足 

    如果我们在实际数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患。因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本

    课后练习

    1. #第14章_视图练习题
    2. 练习1
    3. 题目:
    4. #1. 使用表employees创建视图employee_vu,其中包括姓名(LAST_NAME)
    5. # ,员工号(EMPLOYEE_ID),部门号(DEPARTMENT_ID)
    6. CREATE VIEW employee_vu
    7. AS
    8. SELECT last_name,employee_id,department_id
    9. FROM atguigudb.`employees`;
    10. #2. 显示视图的结构
    11. DESC employee_vu;
    12. #3. 查询视图中的全部内容
    13. SELECT *FROM employee_vu;
    14. #4. 将视图中的数据限定在部门号是80的范围内
    15. ALTER VIEW employee_vu
    16. AS
    17. SELECT last_name,employee_id,department_id
    18. FROM atguigudb.`employees`
    19. WHERE department_id=80;
    20. 练习2
    21. 题目:
    22. CREATE TABLE emps1
    23. AS
    24. SELECT * FROM atguigudb.employees;
    25. SELECT *FROM emps1;
    26. #1. 创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
    27. CREATE VIEW emp_v1
    28. AS
    29. SELECT last_name,salary,email
    30. FROM emps1
    31. WHERE phone_number LIKE '011%';
    32. SELECT *FROM emp_v1;
    33. #2. 要求将视图 emp_v1 修改为查询电话号码以‘011’开头的并且
    34. # 邮箱中包含 e 字符的员工姓名和邮箱、电话号码
    35. ALTER VIEW emp_v1
    36. AS
    37. SELECT last_name,salary,email,phone_number
    38. FROM emps1
    39. WHERE phone_number LIKE '011%' AND email LIKE '%e%' ;
    40. #3. 向 emp_v1 插入一条记录,是否可以?
    41. DESC emps;
    42. DESC emp_v1;
    43. # 实测:失败了
    44. INSERT INTO emp_v1(last_name,salary,email,phone_number)
    45. VALUES('Tom',2300,'tom@126.com','1322321312');
    46. #4. 修改emp_v1中员工的工资,每人涨薪1000
    47. UPDATE emp_v1
    48. SET salary =salary+1000;
    49. #5. 删除emp_v1中姓名为Olsen的员工
    50. DELETE FROM emp_v1
    51. WHERE last_name='Olsen';
    52. #6. 创建视图emp_v2,要求查询部门的最高工资高于 12000 的部门id和其最高工资
    53. CREATE VIEW emp_v2
    54. AS
    55. SELECT department_id,MAX(salary)
    56. FROM emps
    57. GROUP BY department_id
    58. HAVING MAX(salary) >12000;
    59. #7. 向 emp_v2 中插入一条记录,是否可以?
    60. SELECT *
    61. FROM emp_v2;
    62. #不可以
    63. INSERT INTO emp_v2
    64. VALUE (400,18000)
    65. #8. 删除刚才的emp_v2 和 emp_v1
    66. DROP VIEW emp_v2,emp_v1;

  • 相关阅读:
    Redis 哈希Hash底层数据结构
    Mac M1安装MongoDB6、后台运行
    快速入门opencv(python版)
    使用MASA Stack+.Net 从零开始搭建IoT平台 第五章 使用时序库存储上行数据
    面试官都震惊,你这网络基础可以啊!
    LeetCode 1038.从二叉搜索树到更大和树
    上线Spring boot-若依项目
    运维工程师面经
    虚拟摄像头之六: 《详解 CameraService 都做了什么》之 CameraService 与 CameraProvider 通讯
    基于指数分布优化的BP神经网络(分类应用) - 附代码
  • 原文地址:https://blog.csdn.net/2401_84526799/article/details/139844966