第十四章、视图.sql 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #第十四章、视图
  2. /*
  3. 1、视图的理解
  4. (1)、视图,可以看做一个虚拟表,本身是不存储数据的。
  5. 视图的本质,就可以看做是存储起来的SELECT语句。
  6. (2)、视图中SELECT语句中涉及到的表,称为基表
  7. (3)、针对视图做DML操作,会影响到对应的基表中的数据。反之亦然。
  8. (4)、视图本身的删除,不会导致基表中数据的删除。
  9. (5)、视图的应用场景:针对于小型项目,不推荐使用视图。
  10. 针对于大型项目,可以考虑使用视图。
  11. (6)、视图的优点:简化查询;控制数据的访问
  12. */
  13. #2、如何创建视图
  14. #准备工作
  15. #创建数据库
  16. CREATE DATABASE dbtest14;
  17. USE dbtest14;
  18. #准备员工信息表
  19. CREATE TABLE emps
  20. AS
  21. SELECT *
  22. FROM atguigudb.`employees`;
  23. #准备部门信息表
  24. CREATE TABLE depts
  25. AS
  26. SELECT *
  27. FROM atguigudb.`departments`;
  28. SELECT * FROM emps;
  29. SELECT * FROM depts;
  30. DESC emps;
  31. DESC atguigudb.employees;
  32. #2.1、针对于单表
  33. #情况一:视图中的字段与基表的字段有对应关系
  34. CREATE VIEW vu_emp1
  35. AS
  36. SELECT employee_id,last_name,salary
  37. FROM emps;
  38. SELECT * FROM vu_emp1;
  39. #确定视图中字段名的方式1
  40. CREATE VIEW vu_emp2
  41. AS
  42. SELECT employee_id emp_id,last_name lname,salary #查询语句中字段的别名会作为视图中字段的名称出现
  43. FROM emps
  44. WHERE salary > 8000;
  45. SELECT * FROM vu_emp2;
  46. #确定视图中字段名的方式2
  47. CREATE VIEW vu_emp3(emp_id,lname,monthly_sal) #小括号内字段个数与SELECT中字段个数相同
  48. AS
  49. SELECT employee_id,last_name,salary
  50. FROM emps
  51. WHERE salary > 8000;
  52. SELECT * FROM vu_emp3;
  53. #情况二:视图中的字段在基表中可能没有对应的字段
  54. CREATE VIEW vu_emp_sal
  55. AS
  56. SELECT department_id,AVG(salary) avg_sal
  57. FROM emps
  58. WHERE department_id IS NOT NULL
  59. GROUP BY department_id;
  60. SELECT * FROM vu_emp_sal;
  61. #2.2、针对于多表
  62. CREATE VIEW vu_emp_dept
  63. AS
  64. SELECT e.employee_id,e.department_id,d.department_name
  65. FROM emps e JOIN depts d
  66. ON e.department_id = d.department_id;
  67. SELECT * FROM vu_emp_dept;
  68. #利用视图对数据进行格式化
  69. CREATE VIEW vu_emp_dept1
  70. AS
  71. SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
  72. FROM emps e JOIN depts d
  73. ON e.department_id = d.department_id;
  74. SELECT * FROM vu_emp_dept1;
  75. #2.3、基于视图创建视图
  76. CREATE VIEW vu_emp4
  77. AS
  78. SELECT employee_id,last_name
  79. FROM vu_emp1;
  80. SELECT * FROM vu_emp4;
  81. CREATE VIEW vu_emp5
  82. AS
  83. SELECT last_name,department_name,salary*12 year_sal
  84. FROM vu_emp1 e JOIN vu_emp_dept d
  85. WHERE e.employee_id = d.employee_id
  86. SELECT * FROM vu_emp5;
  87. #3、查看视图
  88. #语法1:查看数据库的表对象、视图对象
  89. SHOW TABLES;
  90. #语法2:查看视图的结构
  91. DESCRIBE vu_emp1;
  92. #语法3:查看视图的属性信息
  93. SHOW TABLE STATUS LIKE 'vu_emp1';
  94. #语法4:查看视图的详细定义信息
  95. SHOW CREATE VIEW vu_emp1;
  96. #4、“更新”视图中的数据
  97. #4.1、一般情况,可以更新视图的数据
  98. SELECT * FROM vu_emp1;
  99. SELECT employee_id,last_name,salary
  100. FROM emps;
  101. #更新视图的数据,会导致基表中数据的修改
  102. UPDATE vu_emp1
  103. SET salary = 20000
  104. WHERE employee_id = 101;
  105. #同理,更新表中的数据,也会导致视图中的数据的修改
  106. UPDATE emps
  107. SET salary = 10000
  108. WHERE employee_id = 102;
  109. #删除视图中的数据,也会导致表中的数据的删除
  110. DELETE FROM vu_emp1
  111. WHERE employee_id = 103;
  112. SELECT employee_id,last_name,salary
  113. FROM emps;
  114. #4.2、不能更新视图中的数据
  115. SELECT * FROM vu_emp_sal;
  116. #更新失败
  117. UPDATE vu_emp_sal
  118. SET avg_sal = 5000
  119. WHERE department_id = 30;
  120. #删除失败
  121. DELETE FROM vu_emp_sal
  122. WHERE department_id = 30;
  123. #5、修改视图
  124. DESC vu_emp1;
  125. #方式一
  126. CREATE OR REPLACE VIEW vu_emp1
  127. AS SELECT employee_id,last_name,salary,email
  128. FROM emps
  129. WHERE salary > 7000;
  130. #方式二
  131. ALTER VIEW vu_emp1
  132. AS
  133. SELECT employee_id,last_name,salary,email,hire_date
  134. FROM emps;
  135. #6、删除视图
  136. SHOW TABLES;
  137. DROP VIEW vu_emp4;
  138. DROP VIEW IF EXISTS vu_emp2,vu_emp3;