Oracle无需占用空间的表(oracle不占空间的表)
Oracle:无需占用空间的表
Oracle数据库是目前世界上使用最广泛的关系型数据库管理系统。在Oracle数据库中,我们经常会创建和使用表,但是表占用的存储空间很大,对于一些特殊的应用场景来说,这种方式不太合适。为了解决这个问题,Oracle提供了无需占用存储空间的表。
这种表在数据库中又称为“虚拟表”(Virtual Tables),它们不保存实际的数据,而是动态生成数据。虚拟表仅在查询时创建,当查询结束时该表会自动删除。相比实际存储数据的表,虚拟表不占用磁盘空间,且在查询效率上也更高。
虚拟表的创建方式如下:
“`sql
CREATE VIEW 表名 AS SELECT 语句
在这个语句中,虚拟表是通过SELECT语句从其他表中来构建的。CREATE VIEW语句只会对虚拟表的结构进行定义,而不是把具体的数据保存在其中。
下面给出一个实例,创建一个虚拟表并添加数据:
```sqlCREATE TABLE emp (
empno NUMBER(4) PRIMARY KEY, ename VARCHAR2(10),
job VARCHAR2(9), mgr NUMBER(4),
hiredate DATE, sal NUMBER(7,2),
comm NUMBER(7,2), deptno NUMBER(2)
);
INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, TO_DATE('17-12-1980','DD-MM-YYYY'), 800, NULL, 20);INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-02-1981','DD-MM-YYYY'), 1600, 300, 30);
INSERT INTO emp VALUES (7521, 'WARD', 'SALESMAN', 7698, TO_DATE('22-02-1981','DD-MM-YYYY'), 1250, 500, 30);INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER', 7839, TO_DATE('2-4-1981','DD-MM-YYYY'), 2975, NULL, 20);
INSERT INTO emp VALUES (7654, 'MARTIN', 'SALESMAN', 7698, TO_DATE('28-9-1981','DD-MM-YYYY'), 1250, 1400, 30);INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839, TO_DATE('1-5-1981','DD-MM-YYYY'), 2850, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER', 7839, TO_DATE('9-6-1981','DD-MM-YYYY'), 2450, NULL, 10);INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, TO_DATE('19-4-1987','DD-MM-YYYY'), 3000, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT',NULL, TO_DATE('17-11-1981','DD-MM-YYYY'), 5000, NULL, 10);INSERT INTO emp VALUES (7844, 'TURNER', 'SALESMAN', 7698, TO_DATE('8-9-1981','DD-MM-YYYY'), 1500, 0, 30);
INSERT INTO emp VALUES (7876, 'ADAMS', 'CLERK', 7788, TO_DATE('23-5-1987', 'DD-MM-YYYY'), 1100, NULL, 20);INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK', 7698, TO_DATE('3-12-1981','DD-MM-YYYY'), 950, NULL, 30);
INSERT INTO emp VALUES (7902, 'FORD', 'ANALYST', 7566, TO_DATE('3-12-1981','DD-MM-YYYY'), 3000, NULL, 20);INSERT INTO emp VALUES (7934, 'MILLER', 'CLERK', 7782, TO_DATE('23-1-1982','DD-MM-YYYY'), 1300, NULL, 10);
接着,我们可以通过以下语句来创建虚拟表:
“`sql
CREATE VIEW emp_dept20 AS SELECT ename, sal FROM emp WHERE deptno = 20;
这里,我们创建了一张名为“emp_dept20”的虚拟表,只包括“ename”和“sal”两列数据,并且过滤出了“deptno=20”的记录。这个虚拟表并没有实际的数据占用空间,而是在查询时自动生成查询结果。
虚拟表不仅可以在查询中使用,还可以用于视图的创建。视图是一个模拟的表,它提供一定的查询功能,并且不保存实际的数据。它是在现有表的基础上创建的,可以包括一张表的任意部分或多个表的部分数据。视图的便利之处在于它不需要额外的存储空间,是对底层表的一种抽象层次。
创建视图的语句与创建虚拟表类似:
```sqlCREATE VIEW 视图名 AS SELECT 语句
下面给出一个实例,创建一个名为“dept_summary”的视图,汇总各部门的员工人数和平均工资:
“`sql
CREATE VIEW dept_summary AS
SELECT deptno, COUNT(*) emp_count, AVG(sal) avg_sal
FROM emp
GROUP BY deptno;
使用视图时,可以像使用表一样进行查询:
```sqlSELECT * FROM dept_summary WHERE deptno = 20;
这个查询就可以得到部门编号为20的员工人数和平均工资。
需要注意的是,视图是基于底层表的查询结果构建的。如果底层表的数据发生变化,那么相应的视图也会发生变化。这就需要我们保证底层表的数据完整性和一致性,才能保证视图的正确性。
总结来说,虚拟表和视图都是Oracle中非常实用的功能。它们提供了一种灵活的方式来组合和管理不同表之间的数据,可以大大简化复杂查询的编写,同时也避免了大量的磁盘空间占用。在日常的Oracle数据库开发和管理中,我们应该熟练掌握虚拟表和视图的使用方法,以便更加高效地处理数据。