MySQL中使用视图(create view)

本文介绍了MySQL中的视图概念,视图的应用场景,如简化SQL操作、数据部分访问权限控制,以及视图的创建、查看和删除。还通过实例展示了如何创建、更新和查询视图,强调了视图更新的限制条件。
一、什么是视图?

视图是虚拟的表,与包含数据的表不一样,视图不包含数据,只包含使用时动态检索数据的查询。可以理解为:视图只是一条被包装的SQL语句,它可以重复使用,简化了SQL语句的编写操作。同时,因其不包含数据,每次都需要从表中重新检索,因此速度较慢。

二、视图的一些常见应用
  1. 重用的SQL语句
  2. 简化复杂的SQL操作,在编写查询后,可以方便地重用它,而不必知道它的基本查询细节
  3. 使用表的组成部分,而不是整个表
  4. 保护数据,可以给用户授予表的特定部分的访问权限,而不是整个表的访问权限
  5. 更改数据格式和表示,视图可以返回与底层表的表示和格式不同的数据
三、视图的规则和限制
  1. 与表一样,视图必须唯一命名,不能与别的视图或表同名
  2. 对于视图数目,没有限制
  3. 创建视图必须有足够的访问权限
  4. 视图可以嵌套,可以从视图中检索数据构造另一个视图
  5. order by 可用在视图中,但是如果从该视图中检索数据时,也使用了order by ,那么视图中本身的order by 将被覆盖
  6. 视图不能索引,也不能有关联的触发器或默认值
  7. 视图可以和表一起使用,如将视图和表联结
四、使用视图
  1. 创建视图:CREATE VIEW
  2. 查看视图:SHOW CREATE VIEW view_name
  3. 删除视图:DROP VIEW view_name
  4. 更新视图:第一种,先将原视图删除,再重新创建视图;第二种,使用CREATE OR REPLACE VIEW如果原视图不存在,将会创建一个新视图,如果原视图存在,则会替换原视图。
五、例子
1.有下面两张表City和CountryLanguage,表中信息如下:

City表:
在这里插入图片描述
CountryLanguage表:
在这里插入图片描述

2.创建视图
CREATE VIEW city_language AS
SELECT a.name,a.countrycode,a.district,a.population,b.language,b.IsOfficial,b.Percentage
FROM City AS a,CountryLanguage AS b
WHERE a.countrycode = b.countrycode;

该语句无返回结果,仅仅是创建了一个名为city_language 的视图,该视图将两张表按照countrycode列的值进行联结。

从视图中检索数据:

SELECT name,population,percentage
FROM city_language;

返回结果:
在这里插入图片描述

当然,我们也能在创建视图时,使用函数,这些原理和上面类似,最主要还是理解视图是什么,创建视图就不难了。

3.更新视图

视图可以使用INSERTUPDATEDELETE 更新,更新视图实际上就是更新其基表。但是如果MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。

如果视图定义中有以下操作,则不能更新视图:

  1. 分组(使用GROUP BYHAVING
  2. 联结
  3. 子查询
  4. 聚集函数(如MIN( )COUNT( )SUM( ) 等)
  5. 使用DISTINCT
  6. 导出(计算)列
六、总结

对于视图,最重要的还是理解视图是什么,可以理解为视图就是一个SQL语句,只不过给这个SQL语句起了一个名字,我们之后不用再重新编写该语句,直接使用它的名字就可以;当我们从视图中检索数据时,MySQL会自动将我们检索的SQL语句和视图的SQL语句合并,给出我们想要的结果,这样就大大简化了我们的操作。

视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。 视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。 视图的优点: 1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2.用户通过简单的查询可以从复杂查询中得到结果。 3.维护数据的独立性,试图可从多个表检索数据。 4.对于相同的数据可产生不同的视图视图分为简单视图和复杂视图: 1、简单视图只从单表里获取数据,复杂视图从多表; 2、简单视图不包含函数和数据组,复杂视图包含; 3、简单视图可以实现DML操作,复杂视图不可以。 语法结构:创建视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 语法解析: OR REPLACE :若所创建的试图已经存在,则替换旧视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用); NOFORCE :如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。 alias:为视图产生的列定义的别名; subquery :一条完整的SELECT语句,可以在该语句中定义别名; WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。 案例3:基于EMP表和DEPT表创建视图 代码演示:视图 SQL> CREATE OR REPLACE VIEW EMPDETAIL 2 AS 3 SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME 4 FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO 5 WITH READ ONLY 6 / VIEW CREATED SQL> SELECT * FROM EMPDETAIL; ① EMPNO ENAME JOB HIREDATE DEPTNO DNAME 7369 SMITH CLERK 17-12月-80 20 RESEARCH 7499 ALLEN SALESMAN 20-2月 -81 30 SALES 7521 WARD SALESMAN 22-2月 -81 30 SALES 7566 JONES MANAGER 02-4月 -81 20 RESEARCH 7654 MARTIN SALESMAN 28-9月 -81 30 SALES 7698 BLAKE MANAGER 01-5月 -81 30 SALES 7782 CLARK MANAGER 09-6月 -81 10 ACCOUNTING 7788 SCOTT ANALYST 19-4月 -87 20 RESEARCH 7839 KING PRESIDENT 17-11月-81 10 ACCOUNTING 7844 TURNER SALESMAN 08-9月 -81 30 SALES 7876 ADAMS CLERK 23-5月 -87 20 RESEARCH 7900 JAMES CLERK 03-12月-81 30 SALES 7902 FORD ANALYST 03-12月-81 20 RESEARCH 7934 MILLER CLERK 23-1月 -82 10 ACCOUNTING 14 ROWS SELECTED 代码解析: ① 对视图可以像表一样进行查询。该视图中隐藏了员工的工资。 删除视图可以使用“DROP VIEW 视图名称”,删除视图不会影响基表的数据。 例如: CREATE OR REPLACE VIEW dept_sum_vw(name,minsal,maxsal,avgsal) AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal) FROM emp e,dept d WHERE e.deptno=d.deptno GROUP BY d.dname; 视图的定义原则: 1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询; 2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用ORDER BY 子句; 3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn; 4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。 视图的查询: 视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。 还可以查询视图的全部信息和指定的数据行和列。 如:检索数据: SQL>SELECT * FROM dept_sum_vw; 查询视图定义: SELECT view_name,text from user_views; 其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS 得到相关信息。 修改视图: 通过OR REPLACE 重新创建同名视图即可。 视图上的DML 操作: DML操作应遵循的原则: 1.简单视图可以执行DML操作; 2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行; 3.在视图不出现下列情况时可通过视图修改基表数据或插入数据: a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字; b.使用表达式定义的列; c.ROWNUM伪列。 d.基表中未在视图中选择的其他列定义为非空且无默认值。 视图可用于保持数据库的完整性,但作用有限。 通过视图执行引用完整性约束可在数据库级执行约束。 WITH CHECK OPTION 子句限定: 通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。 例如: CREATE OR REPLACE VIEW vw_emp20 AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION constraint vw_emp20_ck; 视图 已建立。 查询结果: 复制代码 SELECT empno,ename,job FROM vw_emp20; EMPNO ENAME JOB --------------------- -------------- ------------- 7369 SMITH CLERK 7566 JONES MANAGER 7902 FORD ANALYST 复制代码 修改: UPDATE vw_emp20 SET deptno=20 WHERE empno=7902; 将产生错误: UPDATE vw_emp20 * ERROR 位于第一行: ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句 视图的删除:DROP VIEW VIEW_NAME语句删除视图。 删除视图的定义不影响基表中的数据。 只有视图所有者和具备DROP VIEW权限的用户可以删除视图视图被删除后,基于被删除视图的其他视图或应用将无效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值