zoukankan      html  css  js  c++  java
  • MySQL学习笔记之视图

      视图是对磁盘上保存的表数据的抽象,即抽取一个表或多个表的部分行或列的数据,展示给使用者。

      首先列举下MySQL中最简单的对视图操作的语法:

    1、创建视图:

    create view 视图名 as 
        select语句
    例如:
    create view v_fruit as
        select name,place,weight from t_fruit 
            where weight<=12;

    据我所知,“as”后面的语句肯定都是以“select”开头的,可以理解成视图的创建结果就是一张新的表格,表格里面有哪些东西呢,就是select语句的结果;另外这张新的“表格”的字段与“select”后面的名字对应,在上例中就是name,place,weight,但是也可以用as或省略as的别名形式,改变新“表格”的字段名,例如:

    create view v_fruit as
        select name myname,place as myplace,weight from t_fruit 
            where weight<=12;

    这样,“新表格”的包含的所有字段名就是myname,myplace,weight

    另外,指定视图的字段名可以不用在select后面加as的方法,直接在“视图名”后面加上“(字段1,字段2,...)”的方法,但是括号里面的个数必须跟实际select出来的字段个数一样

    例如以下实现一样的字段名设定效果:

    create view v_fruit(myname,myplace,weight) as
        select name,place,weight from t_fruit 
            where weight<=12
                with check option;

    上面的视图是在一张表的基础上创建的,也可以根据多张表连接查询,或者根据其他的视图创建,即"from"后面可以跟表名,也可以跟视图名,但是千万不能跟子查询!

    例如下面的写法是错的:

    create view v as
        select id,name,place from (select * from t_fruit)
             where id>3;    

    当然,“where”后面跟上子查询是没有问题的。

    2、使用视图:

      视图一旦创建,操作起来就跟表格一样,爱怎么玩就怎么玩,至少你往编辑器里面输语句,肯定不会报错。

      实际执行阶段就不一样了,对于select from的查询操作,肯定不会出任何问题;但是对于增、删、改,因为视图实际存储的只是定义,这三个操作会改动底下的实际的表格,而你看到的view,里面的数据可能来源于好几个表格,也有可能是通过和、平均数等计算得到的,一旦insert、delete或者update,改动就会特别复杂。为了保险起见,对于一些情况,增删改直接会被MySQL系统判定为误操作,无法成功。这里修改失败的情况特别多,只列举几个,比如改动涉及到两个或两个以上的表会失败,改动后not null的列没有值会失败,view的列值通过sum、count等计算得到的会失败。

      还有一个问题要注意,如果底下的table的字段发生变动,比如说字段被删除、重命名等,视图操作就很容易出现错误。因为视图在定义时,select后面的字段名就定死了,不会随着表格字段的变动而变动,即使是select *,也会把*直接替换为相应的固定字段。比如一个view里面本来关联了A,B,C三个字段,现在table把字段C重命名为D,那么view对C字段的使用就会出错。

    3、修改视图:

      有两种方法,一种是常规的alter,另一种可以跟创建视图的共用

    ①alter方法,只需把创建时的create改成alter就行,比如:

    alter view v_fruit as
        select place as myplace,weight from t_fruit 
            where weight<=12;

    ②第1点创建视图里面漏了没说,实际上存在创建和修改视图可以共用的方法:create or replace,只要把create换成这3个单词,其他不要变

    create or replace view v_fruit as
        select place as myplace,weight from t_fruit 
            where weight<=12;

     4、删除视图:

    drop view 视图名;
    或者
    drop view 视图1,视图2,...

    如果某个视图不存在,则会报错,但是其他存在的视图会被正常删除。

    为了防止报错,可以加上“if exists”关键字

    drop view if exists 视图名;

    5、查看视图各字段的定义:

    describe 视图名;
    或者
    desc 视图名;

      

    更深层次分析未完待续。。。

  • 相关阅读:
    thinkPHP 无法加载控制器:Hello
    在html中引用分享的链接
    div中iframe高度自适应问题
    php编写tcp服务器和客户端程序
    Maximum Subsequence Sum (25)——改进版
    水仙花数——升级版
    数据结构实验八——队列打印杨辉三角
    数据结构实验七——循环队列
    数据结构实验六——链队列
    水仙花数(20)
  • 原文地址:https://www.cnblogs.com/zhinengfeiyu/p/4844725.html
Copyright © 2011-2022 走看看