视图的定义:
计算机数据库中的视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
SQL>sqlplus scott/tiger
直接查询
SQL> select empno,ename from emp;
创建视图
SQL> create view emps as select empno,ename from emp;
create view emps as select empno,ename from emp
*
第 1 行出现错误:
ORA-01031: 权限不足
授权并重新创建视图
SQL> conn system/a as sysdba;
已连接。
SQL> grant create view to scott;
授权成功。
SQL> conn scott/tiger
已连接。
SQL> create view emps as select empno,ename from emp;
视图已创建。
查看所有创建的视图
SQL> desc user_views;
SQL> select view_name from user_views;
VIEW_NAME
------------------------------
EMPS
或者
SQL> select object_name from user_objects where object_type like 'VIEW';
OBJECT_NAME
--------------------------------------------------------------------------
EMPS
通过视图查看表信息
SQL> select * from emps;
创建班级表
SQL> create table clazz(id number(10) primary key,cname varchar2(20));
创建班级序列
SQL> create sequence clz_seq
2 start with 1
3 increment by 1;
创建学生表
SQL> create table student (id number(10) primary key, name varchar2(20),cid intdefault 0);
创建学生序列
SQL> create sequence stu_seq
2 start with 1
3 increment by 1;
插入班级表
SQL> insert into clazz values(clz_seq.nextval,'001');
插入学生
SQL> insert into student values(stu_seq.nextval, 'abc',1);
同时查询
SQL> select https://www.wendangku.net/doc/658709646.html,,https://www.wendangku.net/doc/658709646.html,ame from student s,clazz c where c.id=s.cid;
NAME CNAME
-------------------- --------------------
abc 001
luls 001
lily 002
lucy 003
SQL> select https://www.wendangku.net/doc/658709646.html,,https://www.wendangku.net/doc/658709646.html,ame from student s left join clazz c on s.cid=c.id;
NAME CNAME
-------------------- --------------------
luls 001
abc 001
lily 002
lucy 003
bb
没有班级,空值函数
SQL> select https://www.wendangku.net/doc/658709646.html,,nvl(https://www.wendangku.net/doc/658709646.html,ame,'not clazz') from student s left join clazz c on
s.cid=c.id;
NAME NVL(https://www.wendangku.net/doc/658709646.html,AME,'NOTCLAZ
-------------------- --------------------
luls 001
abc 001
lily 002
lucy 003
bb not clazz
创建二个表的视图
SQL> create view stu_cla as select https://www.wendangku.net/doc/658709646.html,,nvl(https://www.wendangku.net/doc/658709646.html,ame,'not clazz') as cname from
student s left join clazz c on s.cid=c.id;
通过视图完成查询
SQL> select * from stu_cla;
NAME CNAME
-------------------- --------------------
luls 001
abc
001
lily 002
lucy 003
bb not clazz
视图就是一种虚拟表
通过视图删除数据,可以直接删除,学生表数据删除了,班级表没有删除
SQL> delete from stu_cla where name like 'abc';
已删除 1 行。
SQL> select * from stu_cla;
NAME CNAME
-------------------- --------------------
luls 001
lily 002
lucy 003
bb not clazz
SQL> select * from student;
ID NAME CID
---------- -------------------- ----------
2 luls 1
3 lily 2
4 lucy 3
5 bb 0
SQL> select * from clazz;
ID CNAME
---------- --------------------
1 001
2 002
3 003
4 004
通过视图可以修改表
SQL> update stu_cla set name='sssssssssss' where name like 'lily';
已更新 1 行。
SQL> select * from student;
ID NAME CID
---------- -------------------- ----------
2 luls 1
3 sssssssssss 2
4 lucy 3
5 bb 0
视图不允许增加数据】
SQL> insert into stu_cla values('ddddddddddddddd','005');
insert into stu_cla values('ddddddddddddddd','005')
*
第 1 行出现错误:
ORA-01733: 此处不允许虚拟列
基表变化,视图页跟着变化
SQL> insert into student values(stu_seq.nextval,';sjflsd',3);
已创建 1 行。
SQL> select * from stu_cla;
NAME CNAME
-------------------- --------------------
luls 001
sssssssssss 002
;sjflsd 003
lucy 003
bb not clazz