精华内容
下载资源
问答
  • 二视图的基本要求
    千次阅读
    2021-01-18 23:12:20

    1. 创建视图

    CREATE VIEW 视图名 AS 查询语句 [WITH CHECK OPTION]

    - 这里WITH CHECK OPTION约束是要求插入或者更新要满足查询语句where后面的条件

    CREATE VIEW test AS SELECT * FROM test_db WHERE 查询条件  WITH CHECK OPTION

    这个test视图在插入数据或者更新数据时便要求满足查询条件的记录才能插入

    2. 删除视图

    DROP VIEW [IF EXIST] 视图名 [视图名] ...

    3. 视图的更新的限制

    - 主键和所有NULL列如果没有出现在视图中,视图不允许更新

    - 子查询中如果出现分组查询,聚合函数,那就不允许更新

    - 更新时必须满足查询本来数据表中的约束,不满足约束的更新或者插入都是不允许的

    - 在创建视图时使用WITH CHECK OPTION选项的话,那么在插入时必须满足查询的条件才允许插入数据

    这个是在mysql中的结果

    - 创建一个视图,后面where跟随一个查询条件,WITH CHECK OPTION要求插入该视图的数据必须满足该查询条件

    mysql> create view author_test AS SELECT id,name,address FROM author where id = 32 WITH CHECK OPTION;

    Query OK, 0 rows affected (0.01 sec)

    - 这个是插入数据的结果

    mysql> insert into author_test values(12,'gafv','gfgd');

    1369 - CHECK OPTION failed 'mysql.author_test'

    4. 查看视图

    show table status where comment = 'view';

    SHOW FULL TABLES WHERE Table_type = 'VIEW'

    更多相关内容
  • 用户二视图 视图概述 视图概述 视图的存储 与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。在定义一个视图时,只是把其定义存放在数据库中,并不直接存储视图对应的数据,视图中的数据是从基表中...
  • 数据库 之视图基本操作SQL语句

    千次阅读 2020-02-11 17:26:08
    一、创建视图 语句格式 CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION]; 1、子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则...
    一、创建视图

    语句格式

    CREATE  VIEW  <视图名>  [(<列名>  [,<列名>])]
    AS  <子查询>
    [WITH  CHECK  OPTION];
    

    1、子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定具体系统的实现
    2、WITH CHECK OPTION:对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)

    注:修改基表的结构后,可能导致表与视图的映象关系被破坏,从而导致该视图不能正确工作

    例1:建立信息系学生的视图

    CREATE VIEW IS_Student
    AS SELECT Sno,Sname,Sage FROM Student WHERE  Sdept= 'IS';
    

    例2:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生

    CREATE VIEW IS_Student
    AS SELECT Sno,Sname,Sage FROM  Student WHERE  Sdept= 'IS'
    WITH CHECK OPTION;
    
    1、基于多个基表的视图

    例3:建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)

    CREATE VIEW IS_S1(Sno,Sname,Grade)
    AS SELECT Student.Sno,Sname,Grade FROM  Student,SC
    WHERE  Sdept= 'IS' AND Student.Sno=SC.Sno AND SC.Cno= '1';
    
    2、基于视图的视图

    例4:建立信息系选修了1号课程且成绩在90分以上的学生的视图

    // IS_S2 基于视图IS_s1:FROM  IS_S1
    CREATE VIEW IS_S2
    AS SELECT Sno,Sname,Grade FROM  IS_S1  WHERE  Grade>=90;
    
    3、带表达式的视图

    例5:定义一个反映学生出生年份的视图

    // 表达式:2014-Sage
    CREATE VIEW BT_S(Sno,Sname,Sbirth)
    AS SELECT Sno,Sname,2014-Sage FROM  Student;
    
    4、分组视图

    例6:将学生的学号及平均成绩定义为一个视图

    // 分组:GROUP BY
    CREAT  VIEW S_G(Sno,Gavg)
    AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
    
    二、删除视图

    语句的格式:

    DROP  VIEW  <视图名>[CASCADE];
    
    • 该语句从数据字典中删除指定的视图定义
    • 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
    • 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
    三、查询视图

    查询视图与查询基本表相同
    例子:在信息系学生的视图中找出年龄小于20岁的学生

    SELECT Sno,Sage FROM IS_Student WHERE Sage<20;
    
    四、更新视图

    更新视图和更新基本表相同

    注:一些视图是不可更新的——当对视图的更新无法转换成对基本表SC的更新时,如修改平均成绩视图中某个学生的平均成绩不可实现

    例:

    // 插入
    INSERT INTO IS_Student VALUES(201215129,’赵新’,20);
    // 修改
    UPDATE IS_Student SET Sname= '刘辰' WHERE Sno= ' 201215122 ';
    // 删除
    DELETE FROM IS_Student WHERE Sno= ' 201215129 ';
    
    展开全文
  • 教科书从复习初中学过的正方体、长方体……的三视图出发,要求学生自己画出球、长方体的三视图;接着,通过“思考”提出了“由三视图想象几何体”的学习任务.进行几何体与其三视图之间的相互转化是高中阶段的新任务...
  • 主流数据库之视图

    多人点赞 热门讨论 2022-04-11 23:15:49
    SHOW TABLES语句查看视图基本信息 查询information schema.views表,可以查看到数据库中所有视图的详细信息 修改视图 CREATE OR REPLACE VIEW语句修改视图 使用ALTER语句修改视图 视图操作 使用SQL语句更新...

    文章目录

    目录

    文章目录

    前言

    视图

    视图概述

    创建视图

    格式

    注意问题:

    示例

    查看视图的方法

    DESCRIBE语句查看视图基本信息

    SHOW TABLES语句查看视图基本信息

    查询information schema.views表,可以查看到数据库中所有视图的详细信息

    修改视图

    CREATE OR REPLACE VIEW语句修改视图

    使用ALTER语句修改视图

    视图操作

    使用SQL语句更新视图

    基本表数据新增后视图自动更新

    删除视图中的数据

    删除视图


    前言

    大家好,我是ice三分颜色。

    个人主页:ice三分颜色的博客

    本文讲了视图的相关知识,创建查看修改删除等。

    走过路过的小伙伴们点个赞和关注再走吧,欢迎评论区交流,努力什么时候开始都不算晚,那不如就从这篇文章开始!

    大家一起成长呀!笔芯


    视图

    视图概述

    1.视图(View)是一个存储指定查询语句的虚拟表,视图中数据来源于由定义视图所引用的表,并且能够实现动态引用,即表中数据发生变化,视图中的数据随之变化。(其本质是来说,是查询语句,起了名称的查询语句,一般我们在查询中写得普通的查询语句,查询完后关掉就没有了。但可以作为视图存下来)

    2.视图是一种数据库对象,是从一个或者多个数据表或视图(视图也可以从视图里进行查询哦)中导出的虚拟表,在数据库中只有视图的定义,而并没有存放视图中的数据,因为视图并没有真实存在的数据,真实的数据还在表中。

    3.浏览视图时所对应数据的行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。通过视图可以实现对基表数据的查询修改。(不能直接进行插入操作哦)

    4.视图让数据库用户使用的更方便了,主要包括:

    简化数据查询和处理。视图可以为用户集中多个表中的数据,简化用户对数据的查询和处理。

    屏蔽数据库的复杂性。数据库表的更改不影响用户对数据库的使用,用户也不必了解复杂的数据库中的表结构。(对于定义了若干张表连接的视图,则将表与表之间的连接操作对用户隐蔽起来。)

    安全性。如果要使用户只能查询或修改用户有权限访问的数据,可以只授予用户访问视图的权限,而不授予访问表的权限,这样来提高数据库的安全性。

    创建视图

    格式

    视图可以建立在一张表上,也可以建立在多张表或既有视图上。格式如下:

    CREATE [OR REPLACE] VIEW 视图名[(column_list)]AS select查询语句

    [ WITH [ CASCADED|LOCAL] CHECK OPTION] ;其中:

    REPLACE表示替换已经创建的视图; WITH[CASCADED|LOCAL]CHECK OPTION表示视图在更新时保证在视图的权限范围之内CHECK OPTION 也叫做强制视图,不建议。CASCADED为默认值,表示更新视图时要满足所有相关视图和表的条件;LOCAL表示更新视图时满足该视图本身定义的条件即可,但一般不被允许。

    视图属于数据库,默认情况下将在当前数据库创建视图,若想在给定数据库常见视图,创建时应将名称指定为 库的名字.视图名字。

    创建视图要求用户具有针对视图的CREATE VIEW权限,同时具有查询设计的列的SELECT权限。

    例:通过SELECT语句查询user表获取权限信息(其中Select priv表示用户是否具有SELECT权限,Create_view表示用户是否具有CREATE VIEW权限)

    SELECT Select_priv,Create_view_priv

    FROM mysql.user WHERE user='root';

    注意问题:

    使用CREATE VIEW语句创建视图时需要注意:

    1.在视图的from子句中不能使用子查询。

    2.在视图的select语句中不能引用系统或用户变量。

    3.在视图的select语句中不能引用预处理语句参数。

    4.在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。

    5.在定义中引用的表或视图必须存在。可使用check table语句检查视图定义是否存在。

    6.在定义中不能引用temporary表,不能创建temporary视图。

    7.不能将触发程序与视图关联在一起。

    示例

    创建一个包含员工编号、姓名、职位和部门编号,并按员工编号升序排序的员工基本信息视图

    CREATE VIEW v_emp_base

    AS SELECT empno,ename,job,deptno FROM employee ORDER BY empno;

    创建一个包含多表连接,以及分组查询的视图(视图的SELECT查询可以包含函数、数据组或经过运算得到的数据,也可以是从多个表中获取数据。)

    CREATE OR REPLACE VIEW v_dept_sal(name,minsal,maxsal,avgsal)

    AS

    SELECT d.dname,MIN(e.sal),MAX(e.sal),AVG(e.sal)

    FROM department d,employee e

    WHERE d.deptno = e.deptno GROUP BY d.dname;

    查询这个视图

    SELECT *from v_dept_sal;

    【示例】创建一个工资大于2000的员工年薪信息的视图(如果视图中的SELECT子句包含限定条件,创建视图时可以使用WITHCHECK OPTION选项。)

    -- 表示在更新该视图时,记录数据要满足工资大于2000的条件

    CREATE VIEW v_emp_salary

    AS

    SELECT empno,ename,sal*12 salary

    FROM employee

    WHERE sal>2000 WITH CHECK OPTION;

    查看视图的方法

    describe、show tables、show table status、show create view语句、查询information_schema数据库下的views表等。

    DESCRIBE语句查看视图基本信息

    DESCRIBE | DESC 视图名;

    演示如下:

    DESCRIBE v_emp_salary;

    SHOW TABLES语句查看视图基本信息

    从MySQL5.1开始,执行SHOW TABLES语句时不仅会显示表的名字,同时也会显示视图的名字。

    SHOW TABLES;

    演示如下:

    show tables;

    查询information schema.views表,可以查看到数据库中所有视图的详细信息

    MySQL数据库中,所有视图的定义都存在information_schema数据库下的views表中。

    SELECT * FROM information_schema.views WHERE 表名='视图名';

    例:查询v_emp_salary视图定义

    SELECT * FROM information_schema.views WHERE table_name='v_emp_salary';

    修改视图

    修改数据库中存在的视图,当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表的一致。

    MySQL中通过CREATE OR REPLACE语句和ALTER语句来修改视图

    CREATE OR REPLACE VIEW语句修改视图

    CREATE OR REPLACE VIEW 视图名 [[(字段列表)]As select查询语句

    [ WITH [ CASCADED|LOCAL] CHECK OPTION] ;

    Create or replace view vw_dept

    AS

    Select *from dept;

    查看视图

    当视图已经存在时,修改语句对视图进行修改;当视图不存在时,创建视图。

    使用ALTER语句修改视图

    ALTER VIEW 视图名字 [(字段列表)]As select查询语句

    [ WITH [ CASCADED|LOCAL] CHECK OPTION];

    修改v_emp_base视图将deptno列改为sal列显示

    ALTER VIEW v_emp_base

    AS SELECT empno,ename,job,sal FROM employee ORDER BY empno;

    视图操作

    在视图上也可以进行修改数据的DML操作(INSERT、UPDATE和DELETE)。因为视图是“虚表”,因此对视图的操作最终会转换为对基本表的操作。

    视图上的DML操作会有如下限制:

    1.若一个视图依赖于多张基表,则一次只能修改一个基表的数据,不能同时修改多个基本表的数据;

    2.如果修改违反了基表的约束条件或视图的with check option条件,则无法更新视图;

    3.如果视图包含连接操作符、DISTINCT关键字、集合操作符(UNION) .聚合函数(COUNT、SUM、MAX等)、GROUP BY、ORDER BY、HAVING子句,则将无法更新视图;

    4.如果视图包含SELECT列的子查询、WHERE子句中的子查询、FROM子句中的子查询,则无法更新视图。

    使用SQL语句更新视图

    通过对视图的更新操作来更新基本表数据

    --根据emloyee表创建empview表

    CREATE TABLE empview AS SELECT * FROM employee;

    --创建视图v_emp_update

    CREATE OR REPLACE VIEW v_emp_update

    AS SELECT empno,ename,sal,deptno FROM empview WHERE deptno=20 WITH CHECK OPTION;

    --操作视图v_emp_update更新数据

    UPDATE v_emp_update SET sal=1000 WHERE ename='SMITH';

    --查看基本表empview中数据的变化

    SELECT empno,ename,sal,deptn o FROM empview WHERE ename='SMITH';

    最后结果如下:

    基本表数据新增后视图自动更新

    向基本表中插入数据,视图数据相应更新--向基本表empview中插入一条记录

    INSERT INTO empview VALUES(7777,'TEST','CLERK',7902,2020-12-17,800,NULL,20);

    --查询视图v_emp_update的数据变化

    SELECT * FROMv_emp_update;

    删除视图中的数据

    使用DELETE操作视图来更新基本表数据--删除视图中的数据

    DELETE FROM v_emp_update WHERE empno=7777;

    --查询基本表中数据的变化

    SELECT* FROM empview;

    删除视图

    删除视图时,只能删除视图的定义,不会删除数据。

    MySQL数据库中,用户必须拥有drop权限才能使用drop view语句来删除视图。

    drop view命令可以删除多个视图,各视图名之间用逗号分隔。

    DROP VIEW [if exists] 视图名 [,视图名]

    删除视图v_emp_update

    DROP VIEW IF EXISTS v_emp_update;

    视图就没有啦

    展开全文
  • 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………………
    
    
    

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

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

    总结

    • 优点

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

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

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

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

    展开全文
  • UML基本概念——动态视图

    千次阅读 2020-08-23 23:50:20
    内容来源:《Thinking in UML》第版 4.2 动态视图 故名思义,动态视图是描述事物动态行为的。需要注意的是,动态视图不能够独立存在,它必须特指一个静态视图或UML元素,说明在静态视图规定的事物结构下它们的...
  • 视图的操作

    千次阅读 2021-11-17 22:43:20
    一、学习任务1:为什么使用视图 通过前面章节的知识可以发现,数据库中关于数据的查询有时候非常复杂,例如表连接、子查询等,这种査询会让程序员感到非常痛苦,因为它逻辑太复杂、编写语句比较多。当这种査询需要...
  • 数据库的视图

    万次阅读 2022-04-14 17:16:02
    一、什么是视图 百度百科的解释是: 视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。 这显然是不能让我们满意的。 数据库中的视图是一个虚拟表,同真实的表一样,...
  • 实验 android 基本控件实验 目的 熟悉 Android 常用控件的基本操作 掌握它们的基本使用方法 了解控件之间的构成关 系熟悉适配器的使用原理 要求 1 了解控件的继承关系 2 掌握适配器的使用 3 掌握信息提示的实现...
  • 转载:3.5 《数据库系统概论》之基本表更新(INSERT、UPDATE、ALTER、DELETE)与视图VIEW(定义、查询、更新)_BitHachi-CSDN博客 0.前言 数据库是SQL Sever 数据库管理系统是Navicat Premium 15 本片文章所用的...
  • 2.3.1 组合体的形成方式及其表面间的过渡关系2.3.2 组合体视图的绘制2.3.3 组合体视图的阅读§2.3 组合体视图的绘制和阅读本节要求1.掌握组合体的形成方式和表面过渡关系2.熟练掌握形体分析法3.掌握组合体视图的绘图...
  • MySQL之视图(VIEW)

    2021-01-19 14:28:53
    一、MySQL视图简介视图是数据库系统中一种非常有用的数据库对象。MySQL5.0 之后的版本添加了对视图的支持。认识视图视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图...
  • 一、为什么要软件架构的多视图 需要架构设计的多重视图方法,从根本上来说是因为需求种类的复杂性所致。以工程领域的例子开道吧。比如设计一座跨江大桥:我们会考虑"连接南北的公路交通"这个"功能需求",从而初步...
  • 物化视图的刷新

    千次阅读 2022-04-24 09:22:42
    物化视图的刷新方式说明 物化视图可以选择三种不同的刷新方式,根据不同的需求,选择不同的刷新方式。 Complete刷新:会删除表中的所有记录(如果是单表刷新,可能会采用Truncate的方式),然后根据物化视图中查询...
  • 组合体三视图的画法

    千次阅读 2021-01-13 04:07:52
    一、形体分析画组合体三视图之前,应对组合体进行形体分析,了解组合体的各基本形体形状、组合方式、相对位置及其在某方向上是否对称,以便对组合体的整体形状有个总的概念, 画它的三视图作好准备。如图1所示的轴承...
  • 软件架构视图—4+1视图模式

    千次阅读 2021-08-11 18:25:38
    一、软件架构 软件架构概念:将若干结构元素进行装配,从而满足系统主要功能和性能需求,并满足其他非功能性的需求,如可靠性、可伸缩性、可移植性和可用性。...基于多个并发视图的使用情况来说明描述软
  • SQL语言 --- 视图

    千次阅读 2022-03-24 10:38:45
    (1)是虚表,是从一个或几个基本表(或视图)导出的表; (2)只存放视图的定义,不存放视图对应的数据; (3)基表中的数据发生变化,从视图中查询出的数据也随之改变。 .定义视图 1.建立视图 C
  • 查询视图的sql语句(mysql创建视图sql语句)2020-07-24 12:07:14共10个回答两种方式,一种是直接在sqlserver的列表中找到,另一种用写语句的方式查询.方法一:1、登陆sqlservermanagerstudio.2、在左边的树找到自己要查询...
  • 视图函数和视图

    千次阅读 2020-03-20 08:18:09
    文章目录视图函数和视图类一、 视图函数1.1 endpoint简介1.2 装饰器注册路由源码浅析1.3 另一种注册路由的方式---app.add_url_rule()1.4 视图函数中添加自定义装饰器视图类2.1 视图类的基本写法三、 详细讲解...
  • 1.视图概述2.视图优点 3.视图与表的区别4.索引概述5.索引的优点
  • 数据库之视图、索引

    千次阅读 2016-10-10 09:03:01
    数据库视图以及索引的概念和作用介绍
  • sql——创建视图和索引

    千次阅读 2021-09-13 15:44:35
    1、使用视图 创建视图:给BILLS表创建视图。创建的视图实际上是一个虚表。 CREATE VIEW DEBTS AS SELECT * FROM BILLS; 可以选择特定的行进行新视图的创建。 CREATE VIEW CREDITCARD_DEBTS AS SELECT * FROM ...
  • mysql实现物化视图

    千次阅读 2020-01-14 10:30:33
    原项目用的是国产数据库人大金仓,因用户要求,需要迁移到mysql5.7上,在搜索解决方法之前有了大致思路就是建立物化视图表,然后使用存储过程或者触发器去更新物化视图表就可以了,但想要找有没有更优的方案,于是就...
  • UML语言中五大视图和九种图形纵览

    千次阅读 2020-12-24 05:57:08
    UML语言纵览视图UML语言中的视图大致分为如下5种:1、用例视图。用例视图强调从系统的外部参与者(主要是用户)的角度看到的或需要的系统功能。2、逻辑视图。逻辑视图从系统的静态结构和动态行为角度显示如何实现系统...
  • 文章目录0.前言1.思维导图2.基本表更新---TABLE(1)插入数据---INSERT INTO① 插入元组② 插入子查询结果(2)修改...视图---VIEW(1)定义视图① 建立视图② 删除视图(2)查询视图(3)更新视图① 更新数据---UP...
  • 视图-数据库习题

    千次阅读 2021-11-29 22:09:46
    SQL语言中,删除一个视图的命令是( )。 A. delete view B. drop view C. clear view D. remove view 正确答案: B 数据定义语言需要两个关键字,第一个是动词,第个是名词,表示对象类型。 SQL语言中,创建...
  • 视图几何笔记()射影变换

    千次阅读 2021-10-21 22:00:39
    在点变换下,直线变换为 同样,在点变换下,次曲线的变换变为 由此得到次曲线的变换规则: 等距变换-->相似变换-->仿射变换-->射影变换 1、等距变换 式中,如果,则该等距变换是保向的,也是欧式变换(平移和...
  • 文章目录视图原表一、创建视图二、插入数据三、更新数据四、删除数据Reference 视图 简介: 视图可以看作定义在SQL Server上的虚拟表。视图正如其名字的含义一样,是另一种查看数据的入口。 常规视图本身并不存储...
  • 在Oracle中向视图中插入数据的方法

    千次阅读 2021-05-03 04:18:46
    在Oracle中向视图中插入数据的方法插入视图...如果是连接视图,那就要遵守基本更新准则了.现在我只对INSERT准则做一下说明:在INSERT语句中不能显式或隐式的引用到任何非码保留基础表中的字段,如果在定义视图中使用了W...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,674
精华内容 58,269
热门标签
关键字:

二视图的基本要求