❤️ 简单理解:
视图是数据库对象之一
所有数据库对象名字不能重复,所以视图名字一般是以“v_”开头
视图在SQL语句中体现的角色与表相同但是视图并不是一张真实存在的表,而只是对应一个SELECT语句的查询结果集,并将其当做表看待而已。
使用视图的目的是简化SQL语句的复杂度,重用子查询,限制数据访问。
根据视图所对应的子查询种类分为以下几种类型:
CREATE VIEW v_emp_10
AS
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno=10;
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno id,ename name,sal*12 salary ,deptno
FROM emp
WHERE deptno=10;
视图对应的子查询中的字段若含有函数或者表达式,那么该字段必须指定别名。当视图对应的子查询中的字段使用了别名,那么视图中该字段就用别名
来命名。
修改视图
由于视图仅对应一个SELECT语句,所以修改视图就是替换该SELECT语句而已。
查看视图结构:
SELECT * FROM v_emp_10;
为视图添加检查选项,可以保证对视图的DML操作后视图对其可见,否则不允许进行该DML操作,这样就避免了对基表进行数据污染
eg:
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno id,ename name,sal salary ,deptno
FROM emp
WHERE deptno=10
WITH CHECK OPTION;
添加记录1:
INSERT INTO v_emp_10
(id,name,salary,deptno)
VALUES
(1001,'jack',2000,10);
SELECT * FROM v_emp_10;
INSERT INTO v_emp_10
(id,name,salary,deptno)
VALUES
(1002,'rose',3000,20);
❤️ 小结:
同插入一条记录为是什么jack就不报错,而rose会报错呢?
原因:
因为 WITH CHECK OPTION为视图添加检查选项,可以保证对视图的DML操作后视图对其可见,否则不允许进行该DML操作,由于rose是20号部门的,创建的视图是10号部门的,20号部门数据对10号部门数据不可见所以rose会报错。
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno id,ename name,sal salary ,deptno
FROM emp
WHERE deptno=10
WITH READ ONLY;
SELECT TEXT
FROM user_views;
eg 2:
查询创建过的所有表名
SELECT TABLE_NAME
FROM USER_TABLES;
eg 1:
创建一个含有公司部门工资情况的视图,内容为:部门编号,部门名称,部门的最高,最低,以及工资总和信息
CREATE OR REPLACE VIEW v_salary
AS
SELECT d.dname,d.deptno,
MAX(e.sal) max ,
MIN(e.sal) min,
SUM(e.sal) sum,
AVG(e.sal) avg
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.deptno, d.dname;
SELECT e.ename,e.sal,e.deptno
FROM emp e ,v_salary v
WHERE e.deptno=v.deptno
AND e.sal>v.avg;
DROP VIEW v_salary;
NEXTVAL:获取序列下一个值
若是新创建的序列,那么第一次调用返回的是START WITH指定的值,以后每次调用都会得到当前序列值加上步长后的数字。
NEXTVAL会导致序列发生步进,且序列不能回退。
CURRVAL:获取序列当前值,即:最后一次调用NEXTVAL后得到的值,CURRVAL不会导致步进。但是新创建的序列至少调用一次NEXTVAL后才可以
使用CURRVAL.
/*
删除序列
*/
DROP SEQUENCE seq_emp_id;
/*
在EMP表的NAME列上建立索引
*/
CREATE INDEX idx_emp_ename ON emp(ename);