zoukankan      html  css  js  c++  java
  • 视图

    什么是视图?

    • 视图:虚拟表,和普通表一样使用。mysql5.1版本出现的新特性,是通过表动态生成的数据。
    • 应用场景
      • 多个地方用到同样的查询结果
      • 该查询结果使用的sql语句较复杂
    • 案例
    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 '张%';

    视图的创建

    • 语法:create view 视图名 as 查询语句;
    USE myemployees;
    
    #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`;

    视图的好处

    • 重用sql语句
    • 简化复杂的sql操作,不必知道它的查询细节
    • 保护数据,提高安全性

    视图的修改

    • 语法
      方式一:
    create or replace view 视图名 as 查询语句;
    方式二:
    alter view 视图名 as 查询语句;
    • 案例
    #方式一:
    /*
    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权限。
    • 语法:drop view 视图1,视图2,…;
    • 案例
    /*
    语法:drop view 视图名,视图名,...;
    */
    DROP VIEW emp_v1,emp_v2,myv3;

    视图的查看

    • 语法
    desc 视图名;
    show create view 视图名;
    • 案例
    DESC myv3;
    SHOW CREATE VIEW myv3;

    视图的更新

    • 插入:insert
    • 修改:update
    • 删除:delete
    • 查看:select
    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;
    #1.插入
    
    INSERT INTO myv1 VALUES('张飞','zf@qq.com');
    
    #2.修改
    UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
    
    #3.删除
    DELETE FROM myv1 WHERE last_name = '张无忌';

    注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许

    • 包含以下关键字的sql语句:分组函数、distinctgroup byhavingunion或者union all
    • 常量视图
    • Select中包含子查询
    • join
    • from一个不能更新的视图
    • where子句的子查询引用了from子句中的表
    #具备以下特点的视图不允许更新
    #①包含以下关键字的sql语句:分组函数、distinctgroup  byhaving、union或者union all
    
    CREATE OR REPLACE VIEW myv1
    AS
    SELECT MAX(salary) m,department_id
    FROM employees
    GROUP BY department_id;
    
    SELECT * FROM myv1;
    
    #更新
    UPDATE myv1 SET m=9000 WHERE department_id=10;
    
    #②常量视图
    CREATE OR REPLACE VIEW myv2
    AS
    SELECT 'john' NAME;
    
    SELECT * FROM myv2;
    
    #更新
    UPDATE myv2 SET NAME='lucy';
    
    #③Select中包含子查询
    
    CREATE OR REPLACE VIEW myv3
    AS
    SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
    FROM departments;
    
    #更新
    SELECT * FROM myv3;
    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;
    
    #更新
    SELECT * FROM myv4;
    UPDATE myv4 SET last_name  = '张飞' WHERE last_name='Whalen';
    INSERT INTO myv4 VALUES('陈真','xxxx');
    
    #⑤from一个不能更新的视图
    CREATE OR REPLACE VIEW myv5
    AS SELECT * FROM myv3;
    
    #更新
    SELECT * FROM myv5;
    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
    );
    
    #更新
    SELECT * FROM myv6;
    UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

    视图和表的对比 关键字 是否占用物理空间 使用 视图
    view 占用较小,只保存sql逻辑 一般用于查询 表 table 保存实际的数据 增删改查
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    直播丨国产最强音:HTAP融合型分布式数据库EsgynDB架构详解
    20个MySQL高性能架构设计原则(收藏版)
    RocketMQ进阶-延时消息
    Volatility2.6用法
    【LeetCode】112.路径总和(递归和迭代实现,Java)
  • 原文地址:https://www.cnblogs.com/HelloM/p/14202279.html
Copyright © 2011-2022 走看看