MySQL视图

什么是视图

mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。
好处:

  • 简化sql语句
  • 提高了sql的重用性
  • 保护基表的数据,提高了安全性

使用

创建

 create view 视图名
  as
 查询语句;

修改

//方式一:
create or replace view 视图名
as
查询语句;

//方式二:
alter view 视图名
as
查询语句

删除

drop view 视图1,视图2,...;

查看

desc 视图名;
show create view 视图名;

注意

不是所有的视图都可以做DML操作。有下列内容之一,视图不能做DML操作:

①select子句中包含distinct

②select子句中包含组函数

③select语句中包含group by子句

④select语句中包含order by子句

⑤select语句中包含union 、union all等集合运算符

⑥where子句中包含相关子查询

⑦from子句中包含多个表

⑧如果视图中有计算列,则不能更新

⑨如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作

视图一般用于查询的,而不是更新,所以具备以下特点的视图都不允许更新
①包含分组函数、group by、distinct、having、union、
②join
③常量视图
④where后的子查询用到了from中的表
⑤用到了不可更新的视图

视图和表的对比

关键字 是否占用物理空间 使用
视图view 占用较小,只保存sql逻辑 一般用于查询
表table 保存实际的数据 增删改查

案例

一、创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱

CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,salary,email
FROM employees
WHERE phone_number LIKE '011%';

二、创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息

CREATE OR REPLACE VIEW emp_v2
AS
SELECT MAX(salary) mx_dep,department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>12000;

SELECT d.*,m.mx_dep
FROM departments d
JOIN emp_v2 m
ON m.department_id = d.department_id;
posted @ 2021-07-18 10:51  至安  阅读(103)  评论(0编辑  收藏  举报