首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

表的创设修改及增删改查-DML操作

2013-10-28 
表的创建修改及增删改查-DML操作1.表名和列的命令规则:必须以字母开头,长度不能超过30个字符。不能使用ORAC

表的创建修改及增删改查-DML操作
1.表名和列的命令规则:

必须以字母开头,长度不能超过30个字符。不能使用ORACLE保留字。只能使用A-Za-z0-9$#等。

表 TABLE包括:分区表,TABLE PARTITION       簇CLUSTER  索引表INDEX-ORGANIZED TABLE(IOTs)


2.支持的数据类型:

标量数据类型:

varchar2 最大值4000字符 变长字符型数据

char 最大值2000字符,定长字符型数据

date 日期型数据,取值范围从公元前4712.1.1到9999.12.31    timestamp 精确到毫秒

number   数字型数据,

clob 用于在数据库中存储定长字节的大数据对象,如WORD文件。字符型大对象最大4G 

blob 存储大的无结构二进制对象,如照片或幻灯片。

bfile 用于在数据库外的操作系统文件中存储大的无结构的二进制对象,如电影

raw  在数据库直接存储二进制数据。最大长度2000个字节

LOGN LONG RAW,ORACLE 8  劈头盖脸数据库中存储二进制图像文本等。

3.关于ROWID

在用户向表中插入一行数据时,ORACLE会自动在这一行数据加上一个ROWID,每行都有一个唯一ROWID,ORACLE利用ROWID定位数据行。并不显式存储为一列的值,是访问一个表中行的最快机制。

000000 FFF BBBBBB RRR

数据对象号 相应文件号块号 行号

数据对象号,被赋予每一个对象,在一个数据库中是唯一的。相对文件号,对同一个表空间中每一个文件是唯一的。块号,为相对文件中包含数据行的块的位置。行号,标识块头中行目录位置。

SQL> select ename,rowid from scott.emp;

ENAME     ROWID

---------- ------------------

SMITH     AAAR3sAAEAAAACXAAA

ALLEN     AAAR3sAAEAAAACXAAB

WARD      AAAR3sAAEAAAACXAAC

JONES     AAAR3sAAEAAAACXAAD

SMITH行的数据对象号为AAAR3s,相对文件号AAE,块号AAAACX,行号AAA

#############################

ORACLE数据行结构

行头 row header,存储行中列数,迁移信息,行锁状态。

行数据,一系列列长和列值组成

列长 columnlength,一般需要一个字节,列长度超过250字节,列长为3个字节

列值 columnvalue,列的实际值紧接列长字节后存放。

创建表时,应将不同表放在不同表空间中。

使用本地管理表空间以避免碎片,在表中使用若干标准EXTENT尺寸减少表空间碎片。


4.建表的几种方式

create table语句建表    要指明表名,列名,列数据类型,列宽度,是否有默认值

用查询语句做子句建表。此时新建表的内容将是所查询表的相应列的内容。

create table t2 as select ename name,salsalary from emp;

create table t2 as select * from emp;

用假条件,只对立表结构,不要数据

create table t3(c1,c2,c3) as selectename,empno,sal from emp where 9=1;

手动创建一个表,有五个列,数据类型4位数字,20个变长,2位定长,生日数据类型为日期,奖金最多7位,有两位小数,即最多9999.99

create table student(xh number(4),xmvarchar2(20),sex char(2),birthday date,sal number(7,2));

 

5.修改表

修改列的数据类型、字长

alter table t2 modify(name char(4));

修改表的名称,表的OWNER或SYSDBA修改

rename t2 to t_2;

修改列名称

alter table t3 rename column c1 to name;

表注释和列注释

修改一列:

alter table emp4 modify test varchar2(20);

删除一列:

alter table emp4 drop column test;

 

 

6.删除表

未真将表删除,改为系统命名表,放在回收站,闪回时用到

drop table t2;

show recyclebin;

select * from user_recyclebin;

从回收站将删除的表还原

flashback table t2 tobefore drop;

从回收站将删除的表还原并改名

flashvack  table t2 to  before drop rename tt2;

从回收站删除指定表

purge table t2

清空回收站

purge recyclebin;

直接删除,不放在回收站

drop table t2  purge;

 

7.插入数据

ALTER SESSION SET NLS_DATE_FORMAT='yyyy-mm-dd';

插入全部列的值

insert into student values('001','白不白','男','2012-12-23',99);

插入部分字段

insert into student (xh,xm,sex)values('002','白白白','女');

插入空值NULL

insert into student (xh,xm,sex,birthday)values('003','白不','男',null);

使用函数插入数据

insert into t1(c2) values(sysdate);

日期转换

insert into t29c1) values(to_date('20121223','yyyymmdd')

 

子查询插入,相当于复制表数据,也可以在创建表时用子查询创建

insert into d1 select * from dept;

insert ito emp select * from emp wheredeptno=30;

8.修改数据

修改数据:

update student set sex='女' where xh='001';

一次修改两列数据

update student set sex='女',sal='19'where xh='001';

使用表达式修改

update student set sal=sal+1;

子查询修改

update emp2 set dname=(select dname fromdept where dept.deptno=emp2.deptno);

9.删除

删除所有行

delete t1;

删除符合条件行

delete emp2 where sal>2000;

--删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。DDL语句

truncate TABLE student;

truncate table <tab_name>
这样默认会回收 Extent 的,应该会慢的。

如果是 truncate table <tab_name> resuse storage  ,这样快

truncate表时如遇到主外键约束引起的报错,可以临时关闭相应约束。

SQL> truncate table table_name;

        truncate table table_name * ERROR 位于第 1 行: ORA-02266: 表中的唯一/主键被启用的外部关键字引用
SQL> alter table dorm_employee disableprimary key cascade; 表已更改。
SQL> truncate table dorm_employee; 表已截掉。
SQL> alter table dorm_employee enableprimary key; 表已更改。

10.还原点的设置和使用

提交COMMIT或ROLLBACK后,所有还原点失效。

设置还原点

Savepoint a;

进行修改操作

Savepoint b;

进行删除操作

Savepoint c;

插入操作;

Rollback to a/b/c

可以回滚到设置还原点的状态。


11.分页的操作可以按rowid,RK分析函数。Rownum来分页

下面最主要介绍第三种:按rownum来分

1. rownum 分页

   SELECT * FROM emp;   

 2. 显示rownum[oracle分配的]

SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e;

 rn相当于Oracle分配的行的ID号

3.挑选出6—10条记录

先查出1-10条记录

SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <=10;

如果后面加上rownum>=6是不行的,

4. 然后查出6-10条记录

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHEREROWNUM <= 10) WHERE rn >= 6;

5. 几个查询变化

a. 指定查询列,只需要修改最里层的子查询

只查询雇员的编号和工资

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROMemp) e WHERE ROWNUM <= 10) WHERE rn >= 6;

b. 排序查询,只需要修改最里层的子查询

工资排序后查询6-10条数据

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROMemp ORDER by sal) e WHERE ROWNUM <= 10) WHERE rn >= 6;

 

热点排行