数据库视图详细笔记。视图的优点,视图中DML操作的执行规则,视图如何拒绝DML操作,什么是内建视图 | 您所在的位置:网站首页 › 在视图中不允许包括什么关键字 › 数据库视图详细笔记。视图的优点,视图中DML操作的执行规则,视图如何拒绝DML操作,什么是内建视图 |
文章目录
视图1. 什么是视图2.视图的优越性3.视图的类型4. 简单视图VS复杂视图5. 创建简单视图6. 用子查询中的列别名创建视图7. 从视图中取回数据8. 创建复杂视图9. 在定义视图时指定列名10. 视图中DML操作的执行规则11. 拒绝DML操作12. 通过工具创建视图13. 删除视图14. 内建视图
备注:本文中使用到的sql为HR用户提供的数据和表。HR用户介绍查看以下链接。
https://blog.csdn.net/weixin_45842494/article/details/122528264
视图
视图是数据库其他对象 1. 什么是视图可以通过创建表的视图来表现数据的逻辑子集或数据的组合。视图是基于表或另一个视图的逻辑表,一个视图并不包含它自己的数据,它象一个窗口,通过该窗口可以查看或改变表中的数据。视图基于其上的表称为基表。 简单视图和复杂类型 视图有两种分类:简单和复杂,基本区别涉及DML(NSERT,UPDATE和DELETE)操作。 简单视图: 数据仅来自一个表不包含函数或数据分组能通过视图执行DML操作复杂视图: 数据来自多个表包含函数或数据分组不允许通过视图进行DML操作 5. 创建简单视图示例: 创建一个视图,视图中包含部门id为80的员工的id,名字以及薪水。 create view emp80 as select e.employee_id,e.last_name,e.salary from employees e where e.department_id = 80;说明:试图本身不会做数据的存储。 select * from emp80;当我们执行select去查询视图的时候,拿到的数据还是表中的数据,相当于select间接执行了创建视图时执行的查询语句。 6. 用子查询中的列别名创建视图如果在创建视图的查询语句中包含有列别名,那么列别名将作为视图的列名。 示例: 创建一个视图,包含部门id为50的员工id,使用ID_NUMBER命名该列,包含员工名字使用NAME命名该列,包含员工的年薪使用ANN_SALARY命名该列。 create view emp50 as select e.employee_id id_number,e.last_name name,12*e.salary ann_salary from employees e; 7. 从视图中取回数据示例一: 查询部门id为80的员工信息,包含他们的id,名字和薪水 select * from emp80; 返回(部分): EMPLOYEE_ID LAST_NAME SALARY ----------- ------------------------- ---------- 165 Lee 6800.00 166 Ande 6400.00 167 Banda 6200.00 168 Ozer 11500.00 34 rows selected示例二: 查询部门id为50的员工信息,包含他们的id和薪水。 select e.id_number,e.ann_salary from emp50 e; 返回(部分): ID_NUMBER ANN_SALARY --------- ---------- 201 156000 202 72000 203 78000 110 rows selected说明:当我们使用视图查询数据的时候,只能查询视图中包含的列,不能查询视图中没有的列。 8. 创建复杂视图示例: 创建一个视图,包含每个部门的部门名称,部门最低薪水、部门最高薪水以及部门平均薪水。 create view dept_name as select d.department_name,min(e.salary) min_sal,max(e.salary) max_sal,avg(e.salary) avg_sal from employees e,departments d where e.department_id = d.department_id group by d.department_name;说明:如果视图中包含了函数,必须要给列起别名。 select * from dept_name; 返回(部分): DEPARTMENT_NAME MIN_SAL MAX_SAL AVG_SAL ------------------------------ ---------- ---------- ---------- Development 1000 1000 1000 Administration 4400 4400 4400 Accounting 8300 12008 10154 Executive 17000 24000 19333.3333 12 rows selected 9. 在定义视图时指定列名示例: 创建一个视图, 包含每个部门的部门名称、部门最低薪水、部门最高薪水以及部门的平均薪水。将部门名称命名为name.最低薪水命名为minsal.最高薪水命名为maxsal、平均薪水命名为avgsal。 create view dept_name1(name,minsal,maxsal,avgsal) as select d.department_name,min(e.salary),max(e.salary),avg(e.salary) from employees e,departments d where e.department_id = d.department_id group by d.department_name;说明:给列起别名,可以跟在列的后面,也可以在创建时写在as的前面。 10. 视图中DML操作的执行规则如果视图中包含下面的部分就不能修改数据。 组函数GROUP BY 子句DISTINCT 关键字用表达式定义的列示例: 删除emp80视图中雇员ID为179的雇员。 delete from emp80 e where e.employee_id = 179;说明:emp80视图中没有任何组函数,GROUP BY子句,也没有DISTINCT等关键字。 11. 拒绝DML操作示例: 创建一个简单视图,包含employees表中的所有数据,但该视图拒绝DML操作。 create view v_emp as select * from employees with read only;说明:创建视图时在后面加上with read only表示该视图为只读视图,不能被DML操作。 重点:数据库中的对象名称不能重复,包括视图名称不能和表名称重复等等。 delete from v_emp v where v.DEPARTMENT_ID = 179; 返回: ORA-42399: 无法对只读视图执行 DML 操作 12. 通过工具创建视图
说明:使用工具创建视图要点击执行来创建视图。 13. 删除视图删除视图不会丢失数据,因为视图是基于数据库中的基本表的,视图中不存储数据。 示例: 删除emp90视图。 drop view emp90; 14. 内建视图 内建视图是一个带有别名(或相关名)的可以在SQL语句中使用的子查询。一个主查询的在FROM子句中指定的子查询就是一个内建视图。内建视图:内建视图由位于FROM子句中命名了别名的子查询创建。该子查询定义一个可以在主查询中引用数据源。 示例: 显示那些雇员低于他们部门最高薪水的雇员的名字、薪水、部门号和他们部门最高的薪水。 select em.last_name,em.department_id,e.maxsal from employees em ,(select e.department_id, max(e.salary) maxsal from employees e group by e.department_id) e where em.department_id = e.department_id and em.salary |
CopyRight 2018-2019 实验室设备网 版权所有 |