本文共 5117 字,大约阅读时间需要 17 分钟。
【Oracle】day05_视图_序列_索引_约束
也称为虚表(虚拟的表),视图在SQL语句中体现的地方和表一致,但是其不是数据库中真正存在的表,而是一个SELECT语句的查询结果集,所以视图中有哪些字段,对应的都有哪些记录完全取决于SELECT查询的结果.
eg:
CREATE VIEW v_emp_10 AS SELECT ename,empno,sal,deptno FROM emp WHERE deptno=10; DESC v_emp_10; 1)当我们通过SELECT语句查询视图时,数据库会先使用该视图对应的SELECT语句将数据查询出来,然后将这个结果集当作一张表,再进行我们的SELECT语句,将要查询的数据查询出来.所以,视图就是在FROM中使用子查询. eg:SELECT * FROM v_emp_10;2)视图中对应的子查询中,查询的字段若含有表达式函数,那么必须要添加别名.单纯的字段也可以添加别名.这样创建出来的视图对应的字段名就是该别名.
( OR REPLACE 的作用是如果视图不存在,则创建,存在则替换)
CREATE OR REPLACE VIEW v_emp_10 AS SELECT ename name,empno id,sal FROM emp WHERE deptno=20; DESC v_emp_10; CREATE OR REPLACE VIEW v_emp_10 AS SELECT deptno no,COUNT(*) num FROM emp GROUP BY deptno; DESC v_emp_10; 3)视图的作用:简化复杂查询,限制数据访问.4)对视图进行DML操作只能对简单视图进行.
对视图进行DML操作就是对视图数据来源的基表进行的.
--INSERT
向视图插入数据,数据实际上是插入视图来源的基表中,而且,新增的记录只有视图看得到的字段会有值,其他字段插入默认值.
视图有可能插入一条视图自己看不见的数据,这样会对基表产生数据污染.
INSERT INTO v_emp_10 VALUES('QQQ',1001,6000); SELECT * FROM emp;--UPDATE
更新视图数据,就是更新基表的数据
与INSERT一样,更新视图数据有可能导致视图无法再次查询到该数据!--DELETE
DELETE视图中的数据就是删除表中对应数据,但是删除只能删除视图看得到的数据.--WITH CHECK OPTION 检查选项
当视图添加该选项后, 对视图进行INSERT:必须插入的数据视图可见对视图进行UPDATE:必须更新后视图对其可见
CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal,deptno FROM emp WHERE deptno=10 WITH CHECK OPTION; SELECT * FROM v_emp_10; INSERT INTO v_emp_10_qxl VALUES(1001,'AAAA',2000,20);--错误 UPDATE v_emp_10 SET deptno=20;--WITH READ ONLY 选项
视图就不允许进行DML操作了.(和WITH CHECK OPTION 只能写其一)
CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal,deptno FROM emp WHERE deptno=10 WITH READ ONLY; SELECT * FROM v_emp_10_qxl; INSERT INTO v_emp_10_qxl VALUES(1001,'AAAA',2000,10);--错误 此处不允许虚拟列 UPDATE v_emp_10_qxl SET deptno=20;5)数据字典
查看数据字典,得知用户创建过的所有数据库对象
SELECT object_name,object_type FROM user_objects;只看视图,可以查看视图的数据字典
SELECT text,view_name FROM user_views;只看表
SELECT * FROM user_tables;6)定义复杂视图
--定义一个可以查看各部门薪资情况的视图
CREATE VIEW v_emp_salary_qxl AS SELECT d.dname,AVG(e.sal) avg_sal,SUM(e.sal) sum_sal, MAX(e.sal) max_sal,MIN(e.sal) min_sal FROM emp e JOIN dept d ON e.deptno=d.deptno GROUP BY d.dname; SELECT * FROM v_emp_salary; 复杂视图不允许DML操作7)删除视图
DROP VIEW view_name; DROP VIEW v_emp_10_qxl; SELECT * FROM emp;序列有两个伪列:
-NEXTVAL:向序列要下一个数字
若序列还有没生成过数字,则第一次获取的数字为START WITH指定的数字,否则是用之前生成过的数字加上步长得到的.一旦获取了下一个数字,就无法再通过序列获取之前生成的数字了!
-CURRVAL:向序列要最后一次生成的数字
该伪列可以调用若干次,每次返回的数字一样,并不会导致序列获取下一个值,除非使用NEXTVAL.
需要注意,序列刚创建完毕后,至少要调用NEXTVAL一次生成数字后才可以使用该伪列.
SELECT seq_emp_id_qxl.NEXTVAL FROM dual; SELECT seq_emp_id_qxl.CURRVAL FROM dual; INSERT INTO emp_qxl (empno,ename,sal) VALUES(seq_emp_id_qxl.NEXTVAL,'JACK',5000); SELECT * FROM emp_qxl; 删除序列 语法: DROP SEQUENCE seq_name; eg: DROP SEQUENCE seq_emp_id_qxl;转载地址:http://igews.baihongyu.com/