zoukankan      html  css  js  c++  java
  • MySQL之视图

    什么是视图

    介绍:

      MySQL5.0.1版本开始提供视图功能。可以理解成一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。

    应用场景:

    • 多个地方用到同样的查询结果
    • 该查询结果使用的sql语句较复杂

    视图和表的区别:

      表:占用物理空间。

      视图:不占用物理空间,仅仅保存的是sql逻辑。

    视图的好处:

    1. sql语句提高重用性,效率高。

    2. 和表实现了分离,提高了安全性。

    视图的创建

    语法:

      CREATE VIEW 视图名

      AS

      查询语句;

    示例代码:

    /*
     * 1.查询姓名中包含a字符的员工名、部门名和工种信息
     */
    #创建
    CREATE VIEW my_view1
    AS
    SELECT e.last_name,d.department_name,j.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 my_view1 WHERE last_name LIKE '%a%';
    
    /*
     * 2.查询平均工资最低的部门信息
     */
    #创建
    CREATE VIEW my_view2
    AS
    SELECT AVG(salary) ag_salary,department_id
    FROM employees
    GROUP BY department_id;
    #使用
    SELECT * FROM my_view2 ORDER BY ag_salary LIMIT 1;
    
    /*
     * 3.查询平均工资最低的部门名和工资
     */
    #创建
    CREATE VIEW my_view3
    AS
    SELECT * FROM my_view2 ORDER BY ag_salary LIMIT 1;
    #使用
    SELECT d.*,v.ag_salary
    FROM my_view3 v
    JOIN departments d
    ON v.department_id = d.department_id;

    视图的修改

    语法一:

      CREATE OR REPLACE VIEW 视图名

      AS

      查询语句;

    示例代码:

    /*
     * 方式一
     */
    CREATE OR REPLACE VIEW my_view2
    AS
    SELECT last_name FROM employees
    WHERE employee_id > 100;

    语法二:

      ALTER VIEW 视图名

      AS

      查询语句;

    示例代码:

    /*
     * 方式二
     */
    ALTER VIEW my_view2
    AS
    SELECT employee_id FROM employees;
    
    SELECT * FROM my_view2;

    视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的:

    • 包含以下关键字的sql语句:分组函数、distinctgroup byhavingunion或者union all:

    #创建
    CREATE OR REPLACE VIEW my_view
    AS
    SELECT MAX(salary) m,department_id
    FROM employees
    GROUP BY department_id;
    
    #查询
    SELECT * FROM my_view;
    
    #更新
    UPDATE my_view SET m = 9000 WHERE department_id = 10;
    • 常量视图:

    #创建
    CREATE OR REPLACE VIEW my_view
    AS
    SELECT 'john' NAME;
    
    #查询
    SELECT * FROM my_view;
    
    #更新
    UPDATE my_view SET NAME='lucy';
    • select中包含子查询:

    #创建
    CREATE OR REPLACE VIEW my_view
    AS
    SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资 FROM departments;
    
    #查询
    SELECT * FROM my_view;
    
    #更新
    UPDATE my_view SET 最高工资 = 100000;
    • join:

    #创建
    CREATE OR REPLACE VIEW my_view
    AS
    SELECT last_name,department_name
    FROM employees e
    JOIN departments d
    ON e.department_id  = d.department_id;
    
    #查询
    SELECT * FROM my_view;
    
    #更新
    UPDATE my_view SET last_name  = '张飞' WHERE last_name='Whalen';
    INSERT INTO my_view VALUES('陈真','xxxx');
    • from一个不能更新的视图:

    #创建
    CREATE OR REPLACE VIEW my_view
    AS
    SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
    FROM departments;
    
    #查询
    SELECT * FROM my_view;
    
    #更新
    UPDATE my_view SET 最高工资 = 10000 WHERE department_id = 60;
    • where子句的子查询引用了from子句中的表:

    #创建
    CREATE OR REPLACE VIEW my_view
    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 my_view;
    
    #更新
    UPDATE my_view SET salary = 10000 WHERE last_name = 'k_ing';

    视图的查看

    语法:

      DESC 视图名;

      SHOW CREATE VIEW 视图名;

    示例代码:

    DESC my_view1;
    
    SHOW CREATE VIEW my_view1;

    视图的删除

    语法:

    DROP VIEW 视图名,视图名,...;

    示例代码:

    DROP VIEW my_view2,my_view3;

    视图数据的增删改查

    1.查看视图的数据

    SELECT * FROM my_view;
    
    SELECT * FROM my_view WHERE last_name='Partners';

    2.插入视图的数据

    INSERT INTO my_view(last_name,department_id) VALUES('虚竹',90);

    3.修改视图的数据

    UPDATE my_view SET last_name ='梦姑' WHERE last_name='虚竹';

    4.删除视图的数据

    DELETE FROM my_view;
  • 相关阅读:
    js关闭窗口
    利用DotNetZip服务端压缩文件并下载
    .net 文件下载
    js在一定时间内跳转页面及各种页面刷新
    hosts 配置
    js判断字段是否为空 isNull
    js enter键激发事件
    解决iframe在移动端(主要iPhone)上的问题
    17年年终总结——走过2017,迎来2018Flag
    Node.js系列-express(上)
  • 原文地址:https://www.cnblogs.com/hfl1996/p/13220131.html
Copyright © 2011-2022 走看看