zoukankan      html  css  js  c++  java
  • sql——视图

    为什么使用视图

    当我们在使用多表查询时, 我们的sql语句可能会非常的复杂,如果每次都编写一遍sql'的话无疑是一件麻烦的事情,这时候就可以使用视图来避免多次编写sql的问题;

    简答的说可以帮我们节省sql的编写,

    视图的另一个作用是,可以不同的视图来展示开放不同数据的访问

    例如,同一张工资表,老板可以查看全部,部门主管可以查看该部门所有人,员工只能看自己的一条记录。

    使用方法

    创建视图

    CREATE [OR REPLACE] VIEW view_name [(column_list)]
    AS select_statement

     加上or replace 时如果已经存在相同的视图则替换原有视图

    column_list 指定那些字段要出现在视图中

    注意:由于视图是一张虚拟表,视图中的数据实际来源其他表,所以视图中的数据不会出现在硬盘上。

    使用视图

    视图是一张虚拟表,所以使用正常的表没有任何区别

    查看视图

    1.desc view_name; 查看数据结构

    2.show create view view_name; 查看创建语句

    修改视图

    alter view_name as select_statement

    删除视图

    drop view view_name

    实例

    #准备数据
    create database db02 charset utf8;
    use db02
    create table student(
      s_id int(3),
      name varchar(20),
      math float,
      chinese float 
    );
    insert into student values(1,'tom',80,70),(2,'jack',80,80),(3,'rose',60,75);
    ​
    create table stu_info(
      s_id int(3),
      class varchar(50),
      addr varchar(100)
    );
    insert into stu_info values(1,'二班','安徽'),(2,'二班','湖南'),(3,'三班','黑龙江');

    创建视图

    #创建视图包含 编号 学生的姓名 和班级
    create view view_stu (学号,姓名,班级) as
    select student.s_id,student.name,stu_info.class from student join stu_info on student.s_id = stu_info.s_id;
    查看创建的视图
    select * from view_stu;

    案例2: 隔离数据

    准备数据

    create table salarys(
    id int primary key,
    name char(10),
    salary double,
    dept char(10)
    );
    insert into salarys values
    (1,"刘强东",900000,"市场"),
    (2,"马云",800090,"市场"),
    (3,"李彦宏",989090,"财务"),
    (4,"马化腾",87879999,"财务");
    创建市场部专用的工资视图
    create view view_shichang as
    select * from salarys where dept = "市场";
    查看视图
    select * from view_shichang;
    同时注意:对视图数据的insert update delete会同步到原表中,但是由于视图可能是部分字段,很多时候会失败。
    修改原表中的数据,视图的数据会随之该表。这是建议修改数据的方式,不建议直接对视图中的数据进行修改。

    mysql> select * from view_shichang;
    +----+--------+--------+------+
    | id | name | salary | dept |
    +----+--------+--------+------+
    | 1 | 刘强东 | 900000 | 市场 |
    | 2 | 马云 | 800090 | 市场 |
    +----+--------+--------+------+

    update salarys set salary = 10000 where name = "刘强东";

    mysql> select * from view_shichang;
    +----+--------+--------+------+
    | id | name | salary | dept |
    +----+--------+--------+------+
    | 1 | 刘强东 | 10000 | 市场 |
    | 2 | 马云 | 800090 | 市场 |
    +----+--------+--------+------+

    总结:mysql可以分担程序中的部分逻辑,但这样一来后续的维护会变得更麻烦

    如果需要改表结构,那意味着视图也需要相应的修改,没有直接在程序中修改sql来的方便

  • 相关阅读:
    Objective-C Memory Management Being Exceptional 异常处理与内存
    Objective-C Memory Management 内存管理 2
    c语言全局变量与局部变量(当变量重名时)的使用情况
    c语言指针字符串与字符数组字符串的区别
    c语言数组不同初始化方式的结果
    补码的用途
    struts2框架加载配置文件的顺序
    CSS盒子模型
    基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包自动装配无效
    @Resource注解省略name属性后的行为
  • 原文地址:https://www.cnblogs.com/msj513/p/10020553.html
Copyright © 2011-2022 走看看