Mysql视图的使用

文章来源:https://www.cnblogs.com/geaozhang/p/6792369.html

定义

  • 虚拟表,和普通表一样使用
  • 是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。
  • 基表:用来创建视图的表叫做基表base table

视图的好处

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
  • 安全:和表实现了分离,提高了安全性
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

创建视图

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
   [WITH [CASCADED | LOCAL] CHECK OPTION]
  • 1)OR REPLACE:表示替换已有视图

  • 2)ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表

  • 3)select_statement:表示select语句

  • 4)[WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内

- cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件

- local表示更新视图的时候,要满足该视图定义的一个条件即可

- TIPS:推荐使用WHIT [CASCADED|LOCAL] CHECK OPTION选项,可以保证数据的安全性 
  • 基本格式:
语法:
create view 视图名
as
查询语句;
  • 案例:查询姓张的学生名和专业名
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`
WHERE s.`stuname` LIKE '张%';

CREATE VIEW v1
AS
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`;

SELECT * FROM v1 WHERE stuname LIKE '张%';

查看视图

DESC myv3;

SHOW CREATE VIEW myv3;

修改视图

  • 方式一
create or replace view  视图名
as
查询语句;
  • 示例
SELECT * FROM myv3 

CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
  • 方法二
alter view 视图名
as 
查询语句;
  • 示例
ALTER VIEW myv3
AS
SELECT * FROM employees;

删除视图

语法:drop view IF EXISTS 视图名,视图名,...;
  • 示例
DROP VIEW emp_v1,emp_v2,myv3;
  • 如果视图不存在,则抛出异常;使用IF EXISTS选项使得删除不存在的视图时不抛出异常。

更新视图

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary"
FROM employees;

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;

SELECT * FROM myv1;
SELECT * FROM employees;
  • 插入
INSERT INTO myv1 VALUES('张飞','[email protected]');
  • 修改
UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
  • 删除
DELETE FROM myv1 WHERE last_name = '张无忌';

具备以下特点的视图不允许更新

  • 包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all

  • ③Select中包含子查询

  • ⑤from一个不能更新的视图

  • where子句的子查询引用了from子句中的表

CREATE OR REPLACE VIEW myv6
AS

SELECT last_name,email,salary
FROM employees
WHERE employee_id IN(
	SELECT  manager_id
	FROM employees
	WHERE manager_id IS NOT NULL
);

视图使用注意事项

  • 1)尽量让视图采用merge算法,视图定义中避免DISTINCT、GROUP BY等集合相关运算;
  • 2)如果视图很复杂采用TEMPTABLE的话,想办法减少TEMPTABLE记录数。

你可能感兴趣的:(Mysql)