08.Oracleデータベースビューの学習

08.Oracleデータベースビューの学習

ビューの作成

CREATE [OR REPLACE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH READ ONLY];

作成権限を表示する

grant create view to scott

クエリビュー

-- 创建视图
create view v_emp as select * from emp where DEPTNO = 30;
-- 查询视图
select * from v_emp;

ビューにデータを追加する

-- 向视图中添加数据,执行成功之后,需要提交事务,让数据生效,红色表示回滚事务,让数据恢复原状
insert into v_emp(EMPNO,ENAME) values (1111,'zhangsan');
select *
from emp;

読み取り専用ビューを定義する

-- 如果定义的视图是非只读视图的话,可以通过视图向表中插入数据,如果是只读视图,则不可以插入数据
create view v2_emp as select * from emp with read only;

select *
from v2_emp;
-- 只读视图只提供查询,无法对视图增删改操作
insert into v2_emp(EMPNO,ENAME) values (2222,'lisi');

ビューを削除

-- 删除视图
drop view v2_emp;
-- 当删除视图中的数据时,如果数据来自多个基表中,则此时不能全部删除,只能删除一个表中的数据

練習用の質問

-- 练习题
-- 我们求平均薪水的等级最低的部门,它的部门名称是什么,我们完全使用子查询

-- 求平均薪水
select DEPTNO, avg(sal)
from EMP
group by DEPTNO;
-- 求平均薪水的等级
select e.*,s.GRADE
from (select DEPTNO, avg(sal) avg_sal
      from EMP
      group by DEPTNO) e
         join SALGRADE s on e.avg_sal between s.LOSAL and s.HISAL;
-- 求薪水最低的部分
select min(e2.GRADE)
from (select e.*, s.GRADE
      from (select DEPTNO, avg(sal) avg_sal
            from EMP
            group by DEPTNO) e
               join SALGRADE s on e.avg_sal between s.LOSAL and s.HISAL) e2;
-- 求平均薪水的等级最低的部门的部门名称
select d.DEPTNO,d.DNAME
from DEPT d
         join (select e.DEPTNO, s.GRADE
               from (select DEPTNO, avg(sal) avg_sal
                     from EMP
                     group by DEPTNO) e
                        join SALGRADE s on e.avg_sal between s.LOSAL and s.HISAL) t
              on t.DEPTNO = d.DEPTNO
where t.GRADE = (select min(e2.GRADE)
                 from (select e.*, s.GRADE
                       from (select DEPTNO, avg(sal) avg_sal
                             from EMP
                             group by DEPTNO) e
                                join SALGRADE s on e.avg_sal between s.LOSAL and s.HISAL) e2);

-- 查看sql语句,能发现sql中有许多重复的子查询,可以通过视图将重复的语句给抽象出来

create view v_deptno_grade as select e.*, s.GRADE
                       from (select DEPTNO, avg(sal) avg_sal
                             from EMP
                             group by DEPTNO) e
                                join SALGRADE s on e.avg_sal between s.LOSAL and s.HISAL;
-- 使用视图进行查询
select d.DEPTNO,d.DNAME
from DEPT d
         join v_deptno_grade t
              on t.DEPTNO = d.DEPTNO
where t.GRADE = (select min(e2.GRADE)
                 from v_deptno_grade e2);

おすすめ

転載: blog.csdn.net/Bruce_Zhang0828/article/details/113109903