一、创建简单表
1.1 使用列规范创建表
语法:
CREATETABLE [schema.]tablename [ORGANIZATION HEAP]
(columndatatype [default expression]
[,columndatatype [default expression]]
);
注:DEFAULT 字句可能很有用,但它功能很有限。
分析以下案例:
CREATETABLE SCOTT.EMP
(EMPNONUMBER(4),
ENAMEVARCHAR2(10),
HIREDATEDATE DEFAULT TRUNC(SYSDATE),
SAL NUMBER(7,2),
COMM NUMBER(7,2) DEFAULT 0.03
);
SET LONG9999
Select dbms_metadata.get_ddl(‘TABLE‘,‘EMP‘,‘SCOTT‘)FROM DUAL;
1.2 使用子查询创建表
语法:
CREATETABLE [schema.]table AS subquery;
SQL>create tabel emp_copy as select * from scott.emp;
SQL>createtable emp_dept as select
Last_nameename,department_name dname,round(sysdate -hiredate) service
From employees nutural join departments orderby dname,ename;
创建一个没有数据行的表:
SQL>createtable no_emps as select * from scott.emp where 1=2;
1.3.在创建表之后更改表的定义
(1)添加列
SQL>altertable emp add (job_id number(8));
(2)修改列
SQL>alter table emp modify (commission_pct number(6,2) default 0.05;
(3)删除列
SQL>altertable emp drop column job_id;
(4)标记未使用列
SQL>altertable emp set unused column job_id;
(5)重命名列
SQL>altertable emp rename column hire_date to hiredate;
(6)将表标记为只读
SQL>altertable emp read only;
(7)一次性删除未使用的列
SQL>altertable emp drop unused columns;
1.4 删除表
语法:
Drop table [schema.]tablename;
SQL>droptable emp;
注:删除表之前不会生成警告(任何DDL命令都一样,他们包含了COMMIT),一般不可逆,在一定特定的情况下,可使用闪回技术和其他恢复技术。
1.5 截断表
语法:
Trancate table [schema.]tablename;
SQL>trancate table emp;
注:瞬间清空emp表,表中有一条记录和一亿条记录的速度是一样的。
1.6 创建和使用临时表
临时表包含所有会话都可以访问的定义,但其中的行是插入行的会话专用的。
语法:
Create global temporary table temp_tab_name
(columndatatype [,column datatype])
On commit{delete |preserve} rows;
列的定义与普通表没有区别,末尾的可选句子确定插入的任何行的生命周期。默认方式:在插入行的事务完成时,删除相应的行,但也可以更改此行为,以便将他们保留到插入行的会话结束为止。临时表的数据是临时的,专用于相应的会话,针对其执行的所有SQL命令速度远比针对永久表的命令块。
速度快的原因:
(1)临时表不是永久表空间中的段。
(2)针对临时表的DML不生成重做数据。
【创建和使用临时表案例】
(1)使用peenboo身份登录,创建临时表tmp_emp:
SQL>createglobal temporary table tmp_emp on commit preserve rows as select * from emp where 1=2;
(2)插入一些数据:
SQL>Insertinto tmp_emp select * from emp where department_id=50;
SQL>commit;
(3)使用peenboo身份,启动第二个SQLPLUS
SQL>selectcount(*) from tmp_emp;
SQL>insertinto tmp_emp select * from emp where department_id =60;
SQL>commit;
(4)在第一个会话中截断表:
SQL>truncate table tmp_emp;
(5)在第二个会话中查询,会话副本仍然包含行:
SQL>selectcount(*) from tmp_emp;
(6)在第二个会话中,演示会话终止并不会清除数据行。需要断开连接再次连接。
SQL>disconnect;
SQL>connectpeenboo/dbbocom
SQL>selectcount(*) from tmp_emp;