• MySQL视图


    一、视图

      1、定义

        视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

      创建语法的关键字 是否实际占用物理空间 使用
    视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改
    create table 保存了数据 增删改查

      2、优点

        1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

        2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

        3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

        总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。 

      3、创建视图

    语法:
    create view 视图名
    as
    查询语句;
    #案例1.查询姓名中包含a字符的员工名、部门名和工种信息
    #①创建
    CREATE VIEW myv1
    AS
    SELECT last_name,department_name,job_title
    FROM employees e
    JOIN departments d ON e.department_id  = d.department_id
    JOIN jobs j ON j.job_id  = e.job_id;
    
    #②使用
    SELECT * FROM myv1 WHERE last_name LIKE '%a%';
    
    #案例2.查询各部门的平均工资级别
    #①创建视图查看每个部门的平均工资
    CREATE VIEW myv2
    AS
    SELECT AVG(salary) ag,department_id
    FROM employees
    GROUP BY department_id;
    
    #②使用
    SELECT myv2.`ag`,g.grade_level
    FROM myv2
    JOIN job_grades g
    ON myv2.`ag` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
    
    #案例3.查询平均工资最低的部门信息
    SELECT * FROM myv2 ORDER BY ag LIMIT 1;
    
    #案例4.查询平均工资最低的部门名和工资
    CREATE VIEW myv3
    AS
    SELECT * FROM myv2 ORDER BY ag LIMIT 1;
    
    SELECT d.*,m.ag
    FROM myv3 m
    JOIN departments d
    ON m.`department_id`=d.`department_id`;

      4、视图的修改

    #方式一:存在的时候替换
    /*
    create or replace view  视图名
    as
    查询语句;
    */
    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

      5、删除视图

        语法:drop view 视图名,视图名,...;

          DROP VIEW emp_v1,emp_v2,myv3;

      6、查看视图

        DESC myv3;

        SHOW CREATE VIEW myv3;

      7、视图的更新,会更新基表的数据

    CREATE OR REPLACE VIEW myv1
    AS
    SELECT last_name,email
    FROM employees;
    
    SELECT * FROM myv1;
    SELECT * FROM employees;
    #1.插入
    
    INSERT INTO myv1 VALUES('张飞','zf@qq.com');
    
    #2.修改
    UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
    
    #3.删除
    DELETE FROM myv1 WHERE last_name = '张无忌';

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

    #①包含以下关键字的sql语句:分组函数、distinctgroup  byhaving、union或者union all
    
    CREATE OR REPLACE VIEW myv1
    AS
    SELECT MAX(salary) m,department_id
    FROM employees
    GROUP BY department_id;
    
    #更新
    UPDATE myv1 SET m=9000 WHERE department_id=10;
    
    #②常量视图
    CREATE OR REPLACE VIEW myv2
    AS
    SELECT 'john' NAME;
    
    #更新
    UPDATE myv2 SET NAME='lucy';
    
    #③Select中包含子查询
    CREATE OR REPLACE VIEW myv3
    AS
    SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
    FROM departments;
    
    #更新
    UPDATE myv3 SET 最高工资=100000;
    
    #④join
    CREATE OR REPLACE VIEW myv4
    AS
    SELECT last_name,department_name
    FROM employees e
    JOIN departments d
    ON e.department_id  = d.department_id;
    
    #更新
    UPDATE myv4 SET last_name  = '张飞' WHERE last_name='Whalen';
    INSERT INTO myv4 VALUES('陈真','xxxx');
    
    #⑤from一个不能更新的视图
    CREATE OR REPLACE VIEW myv5
    AS
    SELECT * FROM myv3;
    
    #更新
    UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;
    
    #⑥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
    );
    #更新
    UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';
  • 相关阅读:
    内向者生存手册
    不良言论屏蔽方案探讨——附加一点思考
    提高复用性的编码习惯
    如何管好.net的内存
    谨防信息超载
    .net的反对派们,精神比表面的东西更重要
    为什么我老是半途而废?
    对不起,我也是来给.Net泼冷水的(山寨版)
    把重要的事情先做好
    学英语(外语)的一个误区
  • 原文地址:https://www.cnblogs.com/zhufeng123/p/13910165.html
Copyright © 2020-2023  润新知