回顾:
Mysql学习笔记整理
视图
☞ 释义:一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存sql逻辑而不存储数据结果(ps:不存储数据结果的意思是当前的sql语句查询出来结果是什么视图就会展示什么,一旦真实表中的数据发生改变,该视图中的结果也会发生改变)。
☞ 通俗的解释:临时性、虚拟的,可以将一些查询sql结果存为视图以便重复利用。举个生活中的例子,每个班级抽调一部分学生出来临时组成一个班级,这个临时组成的班级可以干某些特定的事情,当目前不需要这个临时的班级来做特定的事情的时候这个班级可以解散,当需要他们时则重新组合起来,类比视图就是这个功能,本身视图里的东西是虚拟的,但又可以在需要它们时临时实现某些做功能。
☞ 场景
● 多个地方用到同样的查询结果
● 需要的查询结果使用的sql语句较为复杂
☞ 示例
★ 普通的查询: SELECT s.studentname, m.majorname FROM student s INNER JOIN major m ON s.majorid = m.majorid WHERE s.studentname LIKE '张%';
● 存为视图: CREATE VIEW v1 AS SELECT s.studentname, m.majorname FROM student s INNER JOIN major m ON s.majorid = m.majorid;
○ 使用视图查询: SELECT studentname, majorname FROM v1 WHERE studentname LIKE '张%'; //但是无法使用别名
▶ 创建视图
● 语法
CREATE VIEW <视图名称> AS <查询语句>; //查询语句一般是针对比较复杂的sql
● 使用
CREATE VIEW myemp1 AS SELECT e.last_name, d.department_name, j.job_id FROM employees e INNER JOIN departments d ON e.department_id = d.department_id JOIN jobs j ON j.job_id = e.job_id;
SELECT * FROM myemp1 WHERE last_name LIKE '%a%'; //相当于给查询语句起了个名称指代
● 优点
○ 实现sql语句的重用
○ 简化了复杂sql语句的操作,简化了细节
○ 保护数据,提高安全性(向索求方提供特定的数据信息而不用将整张原始表的数据提供出去,保护了用户的隐私安全)
▶ 修改视图
● 方式1:CREATE OR REPLACE VIEW <存在的视图名称> AS <查询语句>;
● 方式2:ALTER VIEW <视图名称> AS <查询语句>;
▶ 删除视图 / 查看视图的结构
● DROP VIEW <要删除的视图名称, 可多个用英文逗号隔开>; //删除视图
● DESC <视图名称>; //查看视图的结构
▶ 视图的更新(更新之后真实表中的数据也会同步修改)
● 理论上视图是允许跟表一样做更新操作的(包括插入数据、修改数据和删除数据),但是在以下几种情况下不允许做更新操作,而这些情景基本上就涵盖了95%以上的sql语句,所以可以认为视图是不允许做更新操作的
○ 包含以下关键字时不允许做更新操作(分组函数、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL)
○ 常量视图不允许更新
○ SELECT中包含子查询时不允许更新
○ 连接查询(包括sql92和sql99语法)不允许更新(能修改,不能插入)
○ FROM后面是一个不能更新的视图(意思是当添加视图时,FROM后面跟着的如果是一个不能更新的视图,那么当添加进新视图后该新视图也不能更新了)
○ WHERE子句的子查询引用了FROM子句中的表,如下上色的表:
CREATE OR REPLACE VIEW myv10 AS
SELECT last_name, salary FROM employees WHERE employee_id IN (
SELECT manager_id FROM employees WHERE manager_id IS NOT NULL
);
▶ 视图和表的区别
创建语法 | 是否占用物理空间 | CRUD是否允许使用 | |
视图 | create view | 占用一小部分物理空间用来存放sql逻辑 | 视图主要用来查,一般不允许增删改 |
表 | create table | 占用物理空间用来存放数据 | 允许增删改查 |
待续。。。