精华内容
下载资源
问答
  • 视图会增加空间吗
    千次阅读
    2021-01-19 07:25:30

    你的位置:

    问答吧

    -> MySQL

    -> 问题详情

    Mysql数据库中视图数量多的话会不会影响服务器的性能

    视图查询时会提高性能这个我知道,如果数据库中视图多的话,对服务器的性能有没有影响?

    有没有具体的数字说明一下。

    非常感谢。

    作者: guojh021

    发布时间: 2010-08-20

    不会。

    理论上的影响很小。你创建10000个视图不过是在MYSQL中生成10000个文件,这个在操作系统上同一目录中文件搜索时会有一点影响(微小)可以忽略不计。

    作者: ACMAIN_CHM

    发布时间: 2010-08-20

    除了占用点空间 其他好像也没怎么样...

    不像MSSQL的视图可以建立索引 修改基础表就需要维护视图了..

    作者: feixianxxx

    发布时间: 2010-08-20

    引用 2 楼 feixianxxx 的回复:

    除了占用点空间 其他好像也没怎么样...

    不像MSSQL的视图可以建立索引 修改基础表就需要维护视图了..

    MSSQL 修改基础表要维护视图?代价多大?

    作者: guojh021

    发布时间: 2010-08-20

    引用 1 楼 acmain_chm 的回复:

    不会。

    理论上的影响很小。你创建10000个视图不过是在MYSQL中生成10000个文件,这个在操作系统上同一目录中文件搜索时会有一点影响(微小)可以忽略不计。

    我想问一下,视图为啥就比SQL要快些?MYSQL是否对视图是否有优化?

    作者: guojh021

    发布时间: 2010-08-20

    引用我想问一下,视图为啥就比SQL要快些?你这个理论哪儿来的?

    视图只不过是减少了语句分析优化的时间。其它方面和直接SQL语句没什么两样。

    作者: ACMAIN_CHM

    发布时间: 2010-08-20

    引用 5 楼 acmain_chm 的回复:

    引用我想问一下,视图为啥就比SQL要快些?你这个理论哪儿来的?

    视图只不过是减少了语句分析优化的时间。其它方面和直接SQL语句没什么两样。

    这样啊。MSSql 对视图进行过优化。Mysql没有吗?

    作者: guojh021

    发布时间: 2010-08-20

    引用 5 楼 acmain_chm 的回复:

    引用我想问一下,视图为啥就比SQL要快些?你这个理论哪儿来的?

    视图只不过是减少了语句分析优化的时间。其它方面和直接SQL语句没什么两样。

    如果没有优化的话,使用视图和直接SQL效果一样了?

    例如:有一个视图View_user 是这样写 select id,name from user where type=1;

    在业务中这样写:Select id,name from view_user

    是不是相当于:select id,name from(select id,name from user where type=1);

    是这样的吗?

    作者: guojh021

    发布时间: 2010-08-20

    Select id,name from view_user

    相当于

    select id,name from user where type=1

    作者: ACMAIN_CHM

    发布时间: 2010-08-20

    没有影响

    作者: mqslll594212

    发布时间: 2010-08-20

    引用 6 楼 guojh021 的回复:

    引用 5 楼 acmain_chm 的回复:

    引用我想问一下,视图为啥就比SQL要快些?你这个理论哪儿来的?

    视图只不过是减少了语句分析优化的时间。其它方面和直接SQL语句没什么两样。

    这样啊。MSSql 对视图进行过优化。Mysql没有吗?

    你这个mssql所谓的优化......哪里来的

    作者: feixianxxx

    发布时间: 2010-08-20

    引用 7 楼 guojh021 的回复:

    引用 5 楼 acmain_chm 的回复:

    引用我想问一下,视图为啥就比SQL要快些?你这个理论哪儿来的?

    视图只不过是减少了语句分析优化的时间。其它方面和直接SQL语句没什么两样。

    如果没有优化的话,使用视图和直接SQL效果一样了?

    例如:有一个视图View_user 是这样写 select id,name from user where type=1;

    在……

    一样

    作者: feixianxxx

    发布时间: 2010-08-20

    更多相关内容
  • 物化视图既然已经是张表了,那么就拥有表的一切特性,可以加索引,可以分区等等,当然也占用存储空间了。所以物化视图是一个用空间换取时间,牺牲实时性,换取使用效率的绝佳方案! 物化视图怎么用 其实很多技巧...

    这是彭文华的第143篇原创

    最近选题都选神经了,就像一只在玩耍毛线团的猫,到处找线头。终于在一个群里看到有人问一个合适的问题了,我这是久旱逢甘霖哪!

    刚看到这个问题的时候我都楞了一下。说起来这个问题我还是在 10 多年前研究的。那时候玩的是 Oracle 。这个问题的回答当然是肯定的,物化视图占存储空间。但我还想多扯两句,把这件事情掰开揉碎了讲一遍。大概是这么个思路吧:

    • 视图是啥?解决啥问题?

    • 物化视图又是啥?又解决啥问题?

    • 大数据场景下,物化视图怎么用?

    什么是视图?

    既然都问这个问题了,那你肯定是个 SQL Boy 了。我们在跑数据的时候,通常要关联很多表。当业务逐渐复杂,表的数量变多的时候,表和表之间的关联关系就会非常非常的繁复。

    为了让事情变的更简单,我们通常会把相对比较常用,且关系比较固定的几个表关联的内容固化下来,以后我们每次都用这个 SQL 脚本就好了。

    各个数据库开发团队也发现这个强需求,就推出了一个“View 视图”的功能,这个视图本质上就是一个 Select 语句。我们查询这个视图,实际上就是做了一个嵌套查询, view 的名称恒等于子查询中的内容。

    因为 View 就是一段 Select  语句,所以 View 几乎不占存储空间。

    我们现在总结一下:View,视图,又叫虚拟表、虚表,主要作用是降低SQL复杂性,让代码工作更简洁。同时因为视图做了表间关系的聚合和字段的重命名,视图也有一定的安全性,外界访问的时候根本无法知道数据库的真实结构是怎样的。

    更重要的是,因为其聚合的特性,视图在数据架构中有非常重要的意义,它可以作为基础表和上层SQL逻辑的解耦工具,规避基础表机构变更带来的上层SQL代码调整的问题。

    视图在传统数据库中大量使用。而在大数据环境中,有时候也会使用。

    什么是物化视图?

    成也萧何败萧何,视图的核心能力其实就是它的核心问题所在。因为视图本质上只是一个 Select 语句,我们查询这个视图的时候实质上还是查询视图中定义的各个基础表。一旦这些关联关系稍微复杂一些、限定条件多一些,那就效率就完蛋了。

    而且因为视图只是一段 SQL ,常规的一些建索引、分区分表等各种优化手段也就彻底失效了。

    那我们能不能既保留视图的降低SQL复杂性、增强安全性和解耦架构等特性,又能规避效率低下的问题呢?当然是有的!这时候就该物化视图出场了。

    物化视图,顾名思义,就是把视图物理化,变成一张类似于物理表的存在。所以,视图是“虚拟”的表,物化视图是“实在”的表。

    创建物化视图和创建普通视图的语句几乎一样,就是把 View 改成materialized view 。只不过物化视图可多一个“更新频率”的参数,就是多久重新物化一次。

    View 只是一个 SQL ,所以不存在数据更新的问题;但是物化视图不一样,他都已经落地成表了,不更新的话,数据永远都那样。

    物化视图既然已经是张表了,那么就拥有表的一切特性,可以加索引,可以分区等等,当然也会占用存储空间了。所以物化视图是一个用空间换取时间,牺牲实时性,换取使用效率的绝佳方案!

    物化视图怎么用

    其实很多技巧在传统数据库的时代就已经很成熟了,既然这些方法这么好用,为啥不在大数据环境中也用上呢?

    所以不仅仅是Oracle 、MySQL 、Postgre 等关系型数据库能做,现在Doris 、ClickHouse 等等各种大数据环境下的分析性数据库也都具备物化视图的功能。Hive 3.0 也增加了这个功能。

    用起来呢,基本上都是一样的。反正原理是一样的,在不同组件里根据他们的要求写一下就好了。

    大致的语法就是:

     CREATE MATERIALIZED VIEW IF NOT EXISTS 物化视图名称

    ON CLUSTER 集群名称,就是放在哪里

    ENGINE = 指定引擎

    PARTITION BY 分区字段

    ORDER BY (排序字段)

    SETTINGS 各种参数

    AS 

    SELECT

    字段1,字段2,字段1*字段2 as 字段3

    FROM 表名称 ,可以关联多个表

    GROUP BY 聚合字段;

    想在哪里用,就把上面的语法按照那个环境的要求稍微修改一下就可了。在Doris 、Clickhouse 、甚至 Spark 也支持物化视图了。

    你看,是不是跟建表是一样一样的?

    不过物化视图千好万好,但还是有三个问题不好解决:

    1、前面说过,物化视图是牺牲实时性,换取查询效率的思路,所以数据更新机制是绕不过去的坎。物化视图毕竟还是在做数据物理化,所以必然会遇到数据多久更新一次的问题,更新时间要根据逻辑的复杂程度和数据量来决定。如果你的实时性要求很高,建议不要用;

    2、物化视图毕竟还是有视图的特性的。所以根本没法执行类似“insert into”的语句往里插入数据,他实质是是“快照”性质。当然,删除数据也是没用的。所以他只适合 OLAP 的场景;

    3、物化视图同时还是空间换时间的典范,所以这个不能多用,要不就泛滥成灾了。数据会爆炸的!存储空间爆发式增长,到时候就一发不可收拾了。

    总结

    视图是数据架构中解耦神器,可以屏蔽复杂逻辑,隐藏原始表结构,具有简化、解耦、安全等特性。但是视图本质上是一段 SQL ,所以效率上有很大的影响。

    物化视图是基于视图的思路,进一步把视图的查询结果物理化成为一张实表,这样既能拥有视图的特性,又能规避效率的问题,是 OLAP 场景中非常好用的手段。

    但是物化视图也有三个问题:

    1、实时性欠缺;

    2、只能刷新,无法增删改数据

    3、需要管理好,避免数据爆炸。

    扩展阅读:数据仓库建设全套资料包,公众号“大数据架构师”后台回复“数据仓库”即可获得。

        

    配合以下文章享受更佳

    干货 | 一口气讲完数据仓库建模方法

    干货 | 如何搭建一个数据仓库

    【资料包】 实时数仓架构选型资料包

    【实战】 手摸手搭建一个实时数据仓库

    【干货】 数仓到底要分多少层?

    我需要你的转发,小小的满足一下我的虚荣心

    展开全文
  • oracle 临时表空间的增删改查操作 oracle 临时表空间的增删改查 1查看临时表空间 dba_temp_files 视图v$tempfile 视图 select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_...
  • 视图聚类方向:子空间学习

    千次阅读 2021-08-10 14:36:06
    本文方法的目标是通过限制标签空间的多样性和一致性来学习多视图聚类的最优标签矩阵。首先将聚类标签松弛为一致性和多样性部分,然后将其集成到基于多视图k-means矩阵分解的模型中,数学公式为 本文方法约束了...

    策略:首先基于多个视图生成一致性表示,再应用现有的聚类算法,如谱聚类来实现最终的聚类结果。

    子空间学习(subspace learning):假设视图间有一个潜在子空间,学习目的是从视图中获得一个合适的子空间,然后为所有视图生成一致性表示,然后将共同的子空间表示矩阵利用谱聚类得到最后的聚类结果。

    例如:

    • Gao hongchang等人首先学习得到多个视图数据的公共子空间表示,再用谱聚类方法对子空间表示矩阵进行聚类得到最后的聚类结果。[16]
    • Liu Iialu等人首先利用非负矩阵分解对多个视图信息进行融合,得到集成多个视图信息的系数矩阵,再用K均值方式得到最后的聚类结果。[25]
    • Yuhong等人利用低秩表示融合多个视图信息获得一致性低秩矩阵,再将其一致性矩阵利用主动三支谱聚类得到最后的聚类结果。[34]
    • K等人利用典型相关分析(Canonical correlation analysis,CCA)将多视图的高维数据投影到低维子空间中,再进行选标准聚类方法进行聚类。[37]

    基于非负矩阵分解的多视图聚类方法[28-30]

    由于多视图数据常常具有高维的数据特点,非负矩阵分解(Non-negative MatrixFactorization,NMF)在数据降维上具有优良的性能。基于NMF的多视图聚类方法由于其简单性和可解释性而已成为广泛使用的多视图聚类算法。

    • Liu Jialu等[25]首次将非负矩阵分解应用于多视图聚类中,结合基与中心的共正则化策略融合视图间的信息,提出的MultiNMF方法取得了较好的聚类结果。
    • Zong Xianchao等[26]将局部结构约束与NMF结合用于多核视图聚类,在聚类的同时保持数据的局部结构。
    • Wang Xiumei 等[27]利用成对约束和NMF用于多视图聚类,同时考虑视图内的相似性和视图间的相似性,获得视图的一致性信息。
    • Cheng Wei等[48]利用semi-NMF用于多视图聚类。
    • 2014年 Li Shaoyuan等[49]提出的PVC方法首次利用NMF和L1稀疏规则算子对两个存在缺失数据的视图进行聚类,PVC的主要思想是在不同视图中描述同一样本的实例应该彼此相似,在视图内部相似的实例应该被划分到同一类。该方法在处理部分视图聚类表现更好,使得基于NMF的多视图聚类方法更多的被用于处理不完整多视图数据。例如 Shao Weishang 等[50]提出的MIC方法结合weighted-NMF和 L2,1规则化对不完整多视图数据进行聚类。Hu Meng等[51]对MIC进行扩展通过weighted semi-NMF和L2,1规则化,使之能处理属性值为负的样本。G.Rai等[52提出的GPMVC方法利用NMF和对每个视图添加图约束使得能处理多个不完整多视图聚类。Zhao Handong 等[53提出的IMG方法结合PVC 和流形学习去捕捉所有样本的全局结构。Qian Bin 等[54提出的DCNMF方法利用簇间相似性和图约束两层约束进行部分多视图聚类。Zhang Xianchao 等[55]和Zong Linlin 等l56利用半监督学习方法结合非负矩阵分解解决视图间的样本对应关系是完全未知的问题,通过在少量视图间样本的对应关系已知的情况下,并提供一种视图间样本关系传递的方式,来得到尽可能多视图间样本的匹配信息,已获得更好的聚类结果。
       


    adaptive weighted graph fusion incomplete multi-view subspace clustering 2020 

     本文方法:首先,为了消除噪声,我们将全部的原始数据转换成潜在表示(可以为每个视图贡献出更好的graph construction),然后我们合并特征提取和不完整的图融合入一个统一的框架,同时两个过程可以相互协商,共同为一个图学习任务服务。一个稀疏正则化被强加在完整图上为了使其具有鲁棒性关于视图不一致。除此之外,不同视图的重要性被自动学习,大大指导了完整视图的构建。

    现有的多视图聚类方法:多核聚类;协同训练和协同正则化;第三种策略协作地转换多视图信息为紧密的共同二进制代码空间,然后在hamming空间进行聚类处理并且使用超越算法加速;最后一种基于子空间的聚类算法,它假设高维数据点是从各种低维子空间描绘得到的,并且每一个簇也能从一个子空间中得到,主要思想是找到几个嵌入在潜在空间中的低维表示然后为下游聚类任务获得一个联合的表示,除此之外,目标是通过矩阵分解/非负矩阵分解找到一个共享的低维潜在表示

    不完整多视图聚类方法:基于非负矩阵分解的方法和基于图的。基于NMF的方法旨在直接获得一个共同的低维表示通过非负矩阵分解。

    半非负矩阵分解:

    本文想法: 


    Feature concatenation multi-view subspace clustering

    FCMSC

     为了利用互补信息,加入图正则化约束,可以保留局部流形结构,gr-FCMSC:

    数据集:

    BBCSport (2个视图,每个视图有5个class,总共544条数据) 

    Movies617(2个视图,每个视图有17个class,总共617条数据)

    MSRCV1(5个视图,每个视图有7个class,总共210条数据)

    Olympics(9个视图,每个视图有28个class,总共464条数据)

    ORL(3个视图,每个视图有40个class,总共400条数据)

    Yale Face(3个视图,每个视图有15个class,总共165条数据)


    2.子空间聚类聚类问题

    ①代数方法

            包括基于矩阵分解的方法和代数几何的方法。基于矩阵分解的方法通过对数据矩阵的低秩分解获得点的划分,因此可以看作PCA从单个到多个独立线性子空间的拓展。但该方法需要预先知道矩阵的秩且要求各子空间相互独立。
           广义主成分分析 (GPCA)是代数方法中的一个代数几何方法,与基于矩阵分解的方法不同的是GPCA不要求线性子空间独立,因此既能处理子空间相互独立的情形也能处理子空间不独立的图形。GPCA用一组 多项式对高维数据进行拟合,多项式在某一数据点的梯度给出了包含该点的子空间的法向量。因此当子空间的个数和维度较小时,算法的计算复杂度也低,但随着子空间个数和维度的增加算法的计算复杂度将呈指数增长。当数据无噪声时,GPCA不用预先知道子空间的个数和维度。另外,由于计算多项式系数向量时采用最小二乘法,因此算法对异常值敏感。

    ②迭代方法
    迭代式方法可以看作是对代数式方法的一种提升。首先通过对数据集的随机分割获得类簇的初始划分,然后对各簇数据集用PCA拟合一个子空间,接着将每个数据点划分到距离它最近的子空间,最后不断重复后两步直到满足收敛条件。K平面算法和K子空间算法是两个经典的迭代方法,两者思路类似K均值(K-Means) 算法,但数据的空间分布存在不同,前者的数据来自超平面,后者则来自仿射子空间。该类算法的优点主要体现在算法的简单上,且能保证迭代在有限步内收敛到一个局部最优解。同时类似于K-Means算法,迭代方法的也将对初始化结果敏感。另外,显然该方法需要预先给定子空间的个数和维度。

    ③统计方法

    代数方法和迭代方法只利用了联合子空间的代数和几何性质,并未对子空间内的数据和噪声的分布做出假设,因此所得的结果并非最优。为解决该问题,统计方法为子空间内的数据定义了生成模型。譬如混合概率主成分分析(MPPCA)通过使用混合的概率PCA模型将概率PCA模型 (PPCA)拓展到了联合子空间。然后通过期望最大化(EM)算法获得混合模型参数的极大似然估计。类似于软K均值算法与K均值算法(也称为硬K均值)之间的关系,MPPCA可以看作K子空间算法在数据点的再分配中采用软分配替代硬分配。但MPPCA预先获知子空间的个数和维度。
            随机抽样一致性算法 (RANSAC)通过迭代法从一组有离群点的数据样本点中拟合统计模型。假设子空间的维度均为d,那么RANSAC每次拟合的模型就是一个维度为d的子空间。RANSAC算法有如下优点:有明确的步骤处理离群点:不需要假设子空间独立,也不需要知道子空间的个数,但实际上子空间的个数间接决定于用户定义的阈值。RANSAC也有严重的缺点,比如上述算法描述中假设每个子空间的维度相同,当子空间的维度各不相同时,则需要通过遍历的方式进行。

    ④基于谱聚类

    基于谱聚类的方法是高维数据聚类分析的重要方法之一-。该类算法主要分两步:第一步也是最为重要的一步,构建数据点间的相似度矩阵。第二步,对所得相似度矩阵使用谱聚类。该类方法最大困难点在于如何定义一个好的相似度矩阵。因为两个数据点可能距离很近却位于不同的子空间,或者两个点距离很远却位于相同的子空间,所以使用基于距离度量的相似度矩阵并不合理。按照相似度矩阵的计算方式,基于谱聚类的方法又可以大致分为三类:基于分解的方法、基于高阶模型的方法、基于自表示的方法。
           基于自表示的方法的基本思想是将样本点表示为同一子空间内其它点的线性组合,然后利用组合系数矩阵构建相似度矩阵。不同于其它基于临近点的线性表示方法,例如局部子空间邻接算法 (LSA)、谱局部最佳拟合平面 (SLBF)、局部线性流型聚类(LLMC)等,后者往往根据点对之间的角距离或者欧式距离确定表示字典,而基于自表示的方法将整个数据集视为表示字典,然后将每个点表示成其它数据点的线性组合。为了解决数据的自表示模型所产生的不适定问题,Elhamifar 和Vidal在文献中引入了稀疏性准则,提出了SSC算法。该算法将每个点写成所有其它点的稀疏线性组合, 然后最小化非零表示系数的个数。文献中 表明如果各子空间独立或不相交,每个点可以表示为同一子空间中其它点的稀疏线性组合。文献中 Liu等人对自表示系数矩阵引入了低秩约束提出了LRR算法。LRR算法在低秩性约束下共同地获得了所有数据点的子空间表示,因此能更好地获得数据的全局结构关系。但是相比SSC算法,LRR算法所获得的系数矩阵往往是稠密的,不利于谱图算法的类簇划分。
           在自表示模型和稀疏低秩约束的基础上,研究人员还提出了许多改进的算法。在文献中,Lu等人在子空间划分问题中引入最小二乘回归(LSR)模型,所提算法不仅对有界扰动具有鲁棒性,而且由于算法具有闭式解大大提高了算法的运行效率。在文献中,Wang等人认为系数表示矩阵一般同时具有稀疏性和低秩性,提出了低秩稀疏子空间聚类算法(LRSSC), 并且给出了算法有效的理论保证。实验结果表明LRSSC算法能既能保留自表示特性,又能拥有图连通性。针对数据不充分或严重受噪声污损情况,提出隐低秩表示算法(LatLRR)。该算法同时使用观测数据和隐式数据构建表示字典,并将子空间分割和特征提取过程融合到同一的框架之中。Lu 等人认为稀疏性和整体效应(grouping effect)对子空间分割都十分重要,前者保证所得系数表示矩阵的块对角特性,后者保证同一空间中的数据点能被正确分组,因此通过引入trace Lasso约束,提出了关系自适应子空间分割算法(CASS)。(2018)
     

    展开全文
  • MYSQL基础之 视图

    千次阅读 2022-01-26 13:37:23
    概念 什么是视图视图是基于 SQL 语句的结果集的可视化的表。 当然视图也是数据库中对象之一,其它的对象包括:表,数据字典,约束,索引,触发器,...视图时一种虚拟表,本身是不具有数据,占用很少的内存空间,是

    概念

    什么是视图?

    视图是基于 SQL 语句的结果集的可视化的表。

    当然视图也是数据库中对象之一,其它的对象包括:表,数据字典,约束,索引,触发器,存储过程,以及存储函数。这些后面再聊,本篇主要聊的就是视图。

    而视图本身不存储数据,而是通过映射原表,方便用户对数据进行查看和操作。

    视图让用户使用表或者多个表的一部分数据,而不是所有的表数据。这样可以针对不同的用户定制不同的查询视图,这样让同样的数据对不同的人呈现不同的假表数据,其实保证了数据的安全。

    视图时一种虚拟表,本身是不具有数据,占用很少的内存空间,是SQL中的重要对象。

    视图的存在依托于已有的表,而这些表时基表。

    • 视图的创建和删除只影响视图本身,不会影响到基表,但是如果对视图的数据进行增删改等操作的时候,基表的数据也会相应的放生变化,反之亦然。
    • 其实创建视图 的时候,需要通过SELECT语言,所以可以将视图简易理解位存储起来的SELECT语言查询结果。视图本身不存储数据的,还是前面说的时映射的数据。

    其实视图时向用户提供基表数据的另一种形式,通常情况下小型项目的数据库可以不适用视图。所以再大型项目,以及数据表比较复杂的情况下,视图就体现出有点了。将经常查询的记过放在视图中,提升使用效率,

    其实视图本质:就是将一个表或多个表关联的查询的结果生成一个视图。而视图本身不存储数据,而是通过映射基表,方便用户对数据进行查看和操作。视图创建和删除不影响基表,但增删改会影响基表。

    创建视图

    创建视图的格式:

    CREATE [OR REPLACE ]
    [ALGORITHM ={ UNDEFINED |MERGE | TEMPTABLE }]
    VIEW 视图名 [(字段名)]
    AS 查询语句
    [WITH [CASCADED |LOCAL] CHECK OPTION ]
    
    -- 上面时完整的结构,但是一般使用格式如下,有点像是通过数据创建表的样式。
    CREATE [OR REPLACE ]
    VIEW 视图名 [(字段名)]
    AS 查询语句
    
    
    
    
    

    对有些新的关键子进行讲解

    • REPLACE 表示替换已经创建的视图
    • ALGORITHM 表示的时视图的算法,其中参数有三个。
      • UNDEFINED: 表示MYSQL将自动选择算法。
      • MERGE:表示将使用的视图语句和视图定义合并,使得视图定义的某一部分取代语句对应的部分。
      • TEMPTABLE:表示将视图的结果存入临时表,然后用临时表执行语句。
    • CASCADED与LOCAL为可选参数
      • CASCADED为默认值。表示更新视图时要满足所有先关视图和表的条件;
      • LOCAL表示更新视图时满足该视图本身定义的条件即可。

    现在开始演示,这个时候就用之前聊查询语言的是表进行,演示也就是,三张表:员工表,部门表和工资等级表。

    员工表:

    在这里插入图片描述

    部门表:

    在这里插入图片描述

    工资等级表:

    在这里插入图片描述

    为了方便演示,直接通过员工表和部门表进行演示。

    SELECT dept.dname,emp.empno,emp.ename FROM  emp, dept WHERE emp.deptno=dept.deptno;
    

    在这里插入图片描述

    然后创建视图:

    CREATE VIEW table_v AS  SELECT dept.dname,emp.empno,emp.ename,emp.sal FROM  emp, dept WHERE emp.deptno=dept.deptno;
    
    -- 然后查询视图
    SELECT * FROM table_v;
    

    在这里插入图片描述

    这个视图没有写视图的字段,这个是可以重新写字段名,但是有一点 ,就是字段个数和SELECT中的字段个数要一样。

    现在有一个一个问题,前面说是的映射的表,那么带有函数的查询语句可以创建视图吗?

    SELECT dept.dname,AVG(emp.sal) FROM  emp, dept WHERE emp.deptno=dept.deptno GROUP BY emp.deptno
    

    在这里插入图片描述

    然后创建视图:

    CREATE VIEW table_v1 (dname,ave_sal) AS  SELECT dept.dname,AVG(emp.sal) FROM  emp, dept WHERE emp.deptno=dept.deptno GROUP BY emp.deptno;
     
    SELECT * FROM table_v1;
    

    在这里插入图片描述

    可以看出调用的MYSQL的函数也是可以创建视图的。如何证明是映射,后面可以通过更新基表,看其是否改变即可。后面修改后面会演示,暂时保留。

    视图的有关的sql

    查询数据库中有多少视图:

    SHOW TABLES; 
    

    在这里插入图片描述

    查看视图结果:

    DESC / DESCRIBE 视图名
    

    例子:

    DESC table_v1;
    

    在这里插入图片描述

    查看视图的属性信息

    -- 查看视图信息(显示存储引擎,版本,数据行数和数据大小等)
    SHOW TABLE STATUS  LIKE '视图名';
    

    演示例子

    -- 先查询表的属性
    SHOW TABLE STATUS  LIKE 'emp';
    

    在这里插入图片描述

    SHOW TABLE STATUS  LIKE 'table_v1';
    

    在这里插入图片描述

    通过视图和表的对比可以看出,视图中的所有属性都是NULL,所以可以通过这个命令确立要查询的表是虚拟表还是真表。

    这个截图看着有点长,如果方便看可以在dos创建查看:

    SHOW TABLE STATUS  LIKE 'table_v1' \G
    

    在这里插入图片描述

    还有一个可以看创建视图的语句。

    SHOW CREATE VIEW 视图名称;
    -- 这个就不在演示了,毕竟前面在表中演示过。
    

    还有可以通过视图生成视图,就像是套娃了,这个就不在演示了。

    视图更新数据

    前面说过如果对数据库视图进行增删改操作会影响原来的数据库。

    当然如果对基表进行操作也会影响视图,两者彼此会影响的。

    现在更新一下视图的

    -- 可以看出更新视图中 empno='7900'的工资950更改位1000
    UPDATE table_v SET table_v.sal='1000'  WHERE table_v.empno='7900';
    
    

    在这里插入图片描述

    现在看一下员工表

    SELECT * FROM emp   WHERE emp.empno='7900';
    

    在这里插入图片描述

    前面不是演示了上面没有更新的视图table_v1如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKOWnpku-1643175420470)(F:\文档\笔记\数据库\mysql\12:视图.assets\image-20220123204753145.png)]

    现在看一下 更新视图中 empno='7900'的工资950更改位1000,影响了基表,然后看一下基表会不会影响视图table_v1;

    在这里插入图片描述

    这个又涉及到一个神奇的操作,那就是是否可以操作table_v1中的ave_sal的值?

    UPDATE table_v1 SET table_v1.ave_sal='1000'  WHERE table_v1.dname='SALES';
    

    在这里插入图片描述

    这个可以看出视图中的字段如果在基表中没有,就会报错,这种没有不是说字段名不一样而是其来源直接没有,这个是通过计算得到的。

    现在看是否删除会相互影响:

    -- 通过删除视图中 empno='7900'的数据
    DELETE FROM table_v  WHERE empno='7900';
    

    前面说过是UPDATE,这个相对限制很小,几乎所有的都可以操作,但是对于INSERT 和DELETE 就有点不同,这个限制有点多。

    如果INSERT 和DELETE可以用前提是视图中行和底层基表中的行必须存在一对一的关系。然后看一下不能增删的视图条件:

    • 在定义视图的是时候指定了”ALGORITHM=TEMPTABLE“,视图将不支持INSERT 和DELETE操作。
    • 视图中不包含基表中所有被定义位非空又未指定默认值的列,视图不支持INSERT 操作。
    • 在定义视图的SELECT语言中使用了JOIN联合查询,视图将不支持INSERT和DELETE操作。所以前面说一下要一对一,毕竟联合查询得到视图,视图就不是一一对应基表了。
    • 在定义视图的SELECT 语言后的字段列表中使用了数字表达式或子查询,视图将不支持INSERT,也不支持INSERT,也不支持UPDATE使用数学表达式,子查询的字段。如果子查询应用了FROM后面的表不但不支持INSERT,还不支持UPDATE,DELETE.
    • 在定义视图的SELECT语句后的字段使用了DISTINCT,聚合函数,GROUP BY,HAVING,UNION等,视图不支持INSERT,UPDATE,DELETE。
    • 视图定义了一个不可更新的表或者式常量视图表。

    上面总结其实有点绕,下面依次演示。

    为了演示效果,所以只是简单的演示,所以数据本身就没有多少意义。

    CREATE TABLE  test_a(
    t_id INT,
    t_name VARCHAR(5),
    t_flag INT
    );
    
    CREATE TABLE test_b(
    t_flag INT,
    t_flag_name VARCHAR(10)
    );
    
    INSERT INTO test_a VALUES (1,'a_a','1');
    INSERT INTO test_a VALUES (2,'a_b','2');
    INSERT INTO test_a VALUES (3,'a_c','2');
    INSERT INTO test_a VALUES (4,'a_d','3');
    INSERT INTO test_b VALUES (1,'b_a');
    INSERT INTO test_b VALUES (2,'b_b');
    INSERT INTO test_b VALUES (3,'b_c');
    
    

    非一对一

    通过join on(= 也是这个其中一个)关联

    CREATE VIEW t_v1 AS
    SELECT  t_name, t_flag_name FROM   test_a,test_b WHERE test_a.`t_flag`=test_b.`t_flag`;
    
    

    其实UPDATE就不在演示了,毕竟前面已经演示了,现在看是否可以插入和删除。

    首先插入:

    INSERT INTO t_v1 VALUES ('a_g','b_g');
    

    在这里插入图片描述

    提示前面没有知名后面的数据指定的字段名,所以这个可以补充字段才行,前提可以试一下如果只有一个字段呢?

    CREATE VIEW t_v2 AS
    SELECT  t_name  FROM   test_a,test_b WHERE test_a.`t_flag`=test_b.`t_flag`;
    
    INSERT INTO t_v2 VALUES ('a_gg');
    
    

    在这里插入图片描述

    可以看出在多表形成视图中哪怕只有一个字段也是需要加入字段名的。

    INSERT INTO t_v1 ( t_name, t_flag_name ) VALUES ('a_g','b_g');
    

    在这里插入图片描述

    然后加全后就报错,无法插入超过一个表以上的视图,无论是否非显示字可以非空都会报错。

    但是如果你插入的是虽然是两个表产生的视图,但是另一个表对呈现的数据没有任何作用,比如上面的t_v2;

    -- 这个就无法通过视图 SELECT * FROM  test_a查看了
    -- 而是通过
    SELECT * FROM  test_a;
    

    在这里插入图片描述

    虽然没有显示但是t_flag 无法匹配 test_b中数据所以只能通过基表看。

    可以看出这个虽然是两个表,但是字段只是一个表显示字段没有用另一个表的,所以可以看成一个表。

    现在看一下如果删除的话:

    DELETE FROM  t_v1;
    

    在这里插入图片描述

    可以看出无法删除多表关联生存的视图。

    现在试一下

    DELETE FROM  t_v2;
    

    在这里插入图片描述

    虽然插入的数据t_v2可以成功,但是删除就报错。

    至于添加默认和非空这个限制就不在多表中体现了,而是在单表演示了。

    子查询

    其实t_v2有点像是用了子查询的意思了,不过还是不同的。现在重新来一个,不过子查询也有两种情况,一种是子查询作为一个条件存在,一个是子查询作为一个字段。

    -- 这一种有人会让其放入一对一的关系中
    CREATE VIEW t_v3 AS
    SELECT  t_name  FROM   test_a  WHERE t_flag IN (SELECT t_flag FROM test_b) ;
    

    在这里插入图片描述

    update就不在演示了,这个其实除非不可改或者限制唯一然后更改了数据重复,一般都是可以用的,主要针对是插入和删除。

    INSERT INTO  t_v3  VALUES ('a_zc');
    

    如果使用的是子查询,在插入的时候可以不带字段名。

    在这里插入图片描述

    在这里插入图片描述

    所以就不用演示带字段名的了,现场尝试一下是否可以删除。

    DELETE FROM  t_v3 WHERE t_name='a_d';
    

    在这里插入图片描述

    可以看出可以删除,同时也影响了原表。

    现在在来一个子查询,这个关联可以在FROM前面

    CREATE VIEW t_v4 (t_name,t_flag_name) AS
    SELECT  t_name ,(SELECT test_b.`t_flag_name` FROM test_b WHERE test_b.`t_flag`=test_a.`t_flag` ) FROM   test_a ; 
    
    

    在这里插入图片描述

    插入就不尝试用前面无字段的,直接演示带字段的,因为带字段的都会报错,不要提不带字段的了

    INSERT INTO  t_v4  (t_name,t_flag_name) VALUES  ('a_v4','b_v4');
    

    在这里插入图片描述

    插入都不靠谱,那就说实话删除也会报错

    DELETE FROM t_v4;
    

    在这里插入图片描述

    一对一

    对于一对一,这个很好理解就是视图本身通过一个表而生成视图,不过这个又会分好几种。如果不涉及任何运算,同时字段中没有非空的或者有非空限制但是又默认值的基表,通过其生成的视图完全可以增删改,而下面举的例子是插入删除的例子。

    聚合函数

    这个最常见的就是AVG,COUNT等所以只列出一个例子。

    test_a表的内容恢复到初始化。

    CREATE VIEW t_v5 AS 
    SELECT t_flag,COUNT(t_flag) t_count FROM test_a GROUP  BY t_flag;
    
    

    现在尝试一下是否可以更新:

    UPDATE t_v5 SET t_flag='5' WHERE t_flag='1';
    

    在这里插入图片描述

    直接报错,那通过函数操作的t_count就更不用演示更新了,这个也会报错的。

    现在尝试一下插入和删除。

    INSERT INTO t_v5   VALUES ('11','12');
    
    

    这种不会报错其没有限制字段,而是直接报错不可以插入数据。

    在这里插入图片描述

    INSERT INTO t_v5 (t_flag,t_count) VALUES ('11','12');
    -- 和不带字段的报错一样,所以不在截图
    

    可以删除吗?

    DELETE FROM  t_v5 WHERE t_flag='1'
    

    在这里插入图片描述

    可见也无法删除。所以说有了聚合函数只能更新无法插入和删除。

    HAVING

    在聚合函数中演示的时候说无法插入和删除,一般使用HAVING的时候常与函数搭配使用,但是目前不考虑效率讲HAVING只作为一个类似WHERE的操作呢?

    CREATE VIEW t_v6 AS 
    SELECT t_flag  FROM test_a HAVING t_flag>'1' ;
    

    更新尝试:

    UPDATE t_v6 SET t_flag='5' WHERE t_flag='3'
    
    

    在这里插入图片描述

    更新都无法操作,为什么会这样呢?虽然讲HAVING当作一个WHERE使用,但是其在SQL中读取的顺序中还是GTOUP BY 等后面,所以前面都无法插入后面的就更不可能会允许更改了,后面的插入和删除就不在演示了,毕竟更新要求最低都不满足插入和删除更不可能了。

    DISTINCT

    CREATE VIEW t_v7 AS 
    SELECT DISTINCT t_id   FROM test_a 
    

    其实为了体现DISTINCT应该使用的字段是t_flag,但是为了演示哪怕这个DISTINCT关键没有意义,但是其还是会影响增改删。

    UPDATE t_v7 SET t_id='5' WHERE t_id='1'
    

    在这里插入图片描述

    看这个就不允许演示插入和删除了吧,还是老话要求最低的你都满足不了,要求更高的就不要想了。

    有时候记前面的有点复杂个人总结记住虽然不敢说全,但是好记够用。

    两表以上相关联,无论通过join还是子查询,删除插入不要想。

    还有一种怪现象,两表想联呈现字段为一表可插不可删。

    更新要求它最低,两表以上就不提哪怕一表有函数,HAVING,DISTINCT等增删改就莫想了。

    没有上面的限制,基表只唯一,查看字段是否有限制。

    修改视图

    这个有两种 第一种:

    CREATE OR REPLACE VIEW 视图名
    [字段]
    as
    查询语句
    

    第二种:

    ALTER VIEW 视图名
    as
    查询语句
    

    这个是整体将视图修改了,比如增加字段或者修改再视图中呈现的字段名。这个感觉有点像是将视图又重新生成了一遍。

    删除视图

    删除视图只是删除视图的定义,并不会删除基表的数据。(是drop 而非delete )

    --
    DROP VIEW [IF EXISTS] 视图名
    
    --
    DROP VIEW [IF EXISTS] 视图名1,视图名2………………
    
    
    

    如果是基于视图创建的视图,如果刹车删除所谓的假基表(视图)也会导致基于假基表视图无法查询出数据,所以需要清楚这个关系。

    类推也就是如果删除基表也会影响视图的查询。

    总结

    • 优点

      • 操作简单,将一些不关心的数据屏蔽掉让开发人员可以更简单的操作表。不用关心表直接关系,只需要查询即可。同时也可以将很多复杂的逻辑进行分解,创作多个视图获取数据,再将视图集合得到最终数据
      • 减少数据冗余: 如果满足操作简单,可以创建一个表插入即可但是占用空间,而视图不会。
      • 数据安全:前面一直说可以隐藏没必要显示的字段,无法得知数据库本来的数据库表结构以及表关系。再结合用户的权限控制会更加保证了数据的安全。
      • 适应灵活多变需求:毕竟业务系统的需求变化后,一般数据库表也会改变结构,则工作量相对较大,可以使用视图来减少这些改动带来的工作量。
    • 缺点

      视图本身是依托基表的,所以基表的修改都会影响视图,有时候修改过大可能需要即使对相关的视图进行维护。有些是视图上创建视图,这样套娃的方式让其维护变得比较负责,可读性不是很友好。

      视图可以重新定义字段名,还可以包含复杂的逻辑,这些都会增加维护成本。

      所以视图是否需用这个需要,需要依托于自己的项目是否需要以及公司要求。

    展开全文
  • 视图聚类与子空间聚类

    千次阅读 2019-06-16 21:57:45
    若对事物作单视图特征表示,则意味着,增加了特征空间的维度,且不同角度的特征合成同一视图,其特征可能失去原有的意义。 而多视图,则能够发挥各个视图的优势,把同一数据表示成多个特征集,然后在每个特征集上...
  • oracle 物化视图及创建索引

    千次阅读 2021-05-07 14:23:08
    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有...
  • 物化视图和普通视图的区别

    千次阅读 2021-03-17 13:51:35
    1、普通视图就是一个虚拟表,不占内存。而物化视图是存在的,占内存。普通视图的查询实际上还是对sql的查询,并不能提高性能,只是看起来直观,简便。 2、物化视图的类型:ON DEMAND、ON COMMIT 二者的区别在于...
  • 【第八篇】MySQL数据库视图详解

    千次阅读 多人点赞 2022-03-04 15:31:05
    1.1 视图概述 视图是一个虚拟表,其内容由 select查询语句定义。和真实的表一样,视图也包含行和列,对视图的...使用视图查询数据时,数据库系统从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中
  • 视图,是一个虚拟的表,不会给视图分配存储空间视图的建立需要依赖于单个或多个普通表,被依赖的普通表就成为"基表"。可以就像 用 select 语句类似,在某些表中选取字段和筛选条件,可以查询出数据,把这数据构成...
  • oracle 临时表空间的增删改查操作 oracle 临时表空间的增删改查 1查看临时表空间?dba_temp_files视图v$tempfile视图 select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_...
  • Oracle物化视图的刷新

    千次阅读 2021-06-15 11:25:14
    物化视图(MATERIALIZED VIEW)是一个包含查询结果的数据库对象。将经常使用的数据拷贝并存储下来,在查询时就可以直接...本质上是一个物理表,占用磁盘空间。本文主要记录了物化视图刷新的方法、时机等相关特性。
  • MySql视图笔记(转载)

    千次阅读 2021-02-07 03:01:34
    1.视图的定义视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表。视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到...
  • 因为sql server 数据库的特性,在设置字符串的时候默认选择的时不设置长度,默认为最大长度(sql server 特性 保存多长就用多大空间,并不默认为用最大空间,这样节省空间,还有利于后期维护,不至于后期因为某些...
  • ClickHouse-物化视图

    千次阅读 2021-12-10 16:30:14
    物化视图 ClickHouse 的物化视图是一种查询结果的持久化,它确实是给我们带来了查询效率的提升。用户查起来跟表没有区别,它就是一张表,它也像是一张时刻在预计算的表,创建的过程它是用了一个特殊引擎,加上后来 as ...
  • 详细介绍mysql中的视图

    千次阅读 2022-04-14 22:44:56
    实际开发中视图很重要,因为视图保证了数据的安全性,比如在开发中包含重要信息的表或者码值表参数表,都是不允许修改,这时候用到视图来保证这些数据的安全性。
  • 在SQL Server 2000和2005中,你能够给视图增加索引。但是,如果视图只是一个保存在数据库中的查询定义,在运行前没有自己的数据,你如何给那个定义建立一个索引呢?嗯,这比较麻烦。 索引视图是一个已被物化或
  • MySQL高级篇之View视图讲解

    千次阅读 2022-02-18 19:29:14
    常见的数据库对象: 对象 说明 ...表是存储数据的逻辑单元,以行和...一个或者多个数据表里的数据的逻辑显示,视图并不存储数据 索引(INDEX) 用于提高查询性能,相当于书的目录 存储过程(PROCEDURE) 用于完成.
  • Oracle物化视图的优缺点

    千次阅读 2021-07-28 23:32:57
    在OLAP的应用场景中经常使用物化视图 业务描述: 外围系统需要访问ERP系统中的数据(两个数据库),可用dblink将两个数据库联接,访问方式有两种: 在目的数据库建立访问源数据库的synonym 优点: 及时性好,只要erp中数据...
  • hive表之视图

    万次阅读 2018-04-23 11:15:35
    hive表之视图1、视图是一个虚表,一个逻辑概念,可以跨越多张表。表是物理概念,数据放在表中,视图是虚表,操作视图和操作表是一样的,所谓虚,是指视图下不存数据。2、视图是建立在已有表的基础上,视图赖以建立的...
  • 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的 价格,则不会提供给...
  • Oracle物化视图与物化视图日志

    万次阅读 多人点赞 2019-04-02 21:43:30
    文章目录物化视图物化视图与普通视图的区别创建一个存放person的表创建一个存放person的address的表初始化数据创建物化视图的语句1.build [immediate|deferred]2.refresh [fast|complete|force] 视图刷新的方式:3.MV...
  • 视图聚类概念

    千次阅读 2022-03-31 10:17:52
    文章目录一、多视图聚类方法分类1.1区分方法(基于相似性)的方法二、多视图聚类半监督多视图学习多视图聚类(MVC)的两个重要原则,互补性和共识原则 一、多视图聚类方法分类 ...公共系数矩阵(多视图空间聚类) 公
  • 详解clickhouse中的物化视图

    千次阅读 2021-08-18 14:52:00
    在讲物化视图前,我们先来回顾一下什么是视图视图是由若干个字段以及若干条记录构成(也常称为虚标),它与表有很多相似的地方,视图中的数据源来自于原表,视图本身不存储数据,视图它保存的仅仅是一条select语句,...
  • ClickHouse性能优化?试试物化视图

    千次阅读 2021-04-07 08:54:58
    本文主要分享物化视图的特性与如何使用它来优化ClickHouse的查询性能。
  • Oracle-动态性能视图解读

    万次阅读 2016-11-18 19:43:36
    启动例程时,ORACLE自动建立动态性能视图;停止例程时,ORACLE自动删除动态性能视图。数据字典信息是从数据文件中获得,而动态性能视图信息是从SGA和控制文件取得。所以,两者所反映的信息还是有很大差异的。...
  • 文章目录物化视图1. 出现背景2. 简介3. 创建选型3.1 刷新的2种模式:3.2 刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。3.3 查询重写(Query Rewrite):ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种4. 基于...
  • ClickHouse SQL中的DDL,除了可以定义数据库、表、索引和视图等之外,还可以定义函数和字典等。 1.1.2. 创建数据库 语法 CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = db_engine(...)...
  • Oracle 视图(View) 说明

    千次阅读 2021-05-03 07:57:19
    视图的定义视图(view),也称虚表,不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL.视图是从一个或多个实际表中获得的,这些...
  • ORACLE物化视图视图区别

    千次阅读 2017-09-28 17:39:54
    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,897
精华内容 59,158
热门标签
关键字:

视图会增加空间吗