[TOC]
曾
表
# 必须具备创建表的权限、一定的存储空间
create table 表名(
列名 数据类型 约束,
列名 数据类型 约束,
... ...
);
# 示例:
create table student(
sno number primary key,
sname varchar2(50) not null,
sbirth date,
sgrade number(2) foreign key references dept(deptno) ,
ssex char(5) check(ssex='男' or ssex='女'),
stel char(11),
sid varchar2(18) unique,
smail varchar2(30)
);
CREATE TABLE 表名 AS SELECT ... FROM...;
CREATE TABLE 表名(列名, 列名...) AS SELECT ... FROM...;
# 示例:
CREATE TABLE dept10
AS
SELECT empno, ename, sal+1000 newSalary
FROM emp WHEREdeptno=10;
同义词 (别名)
是指向数据库对象(如:表、视图、序列、存储过程等) 的数据库指针。
相当于一个别名
好处
- 可以简化对数据库对象的访问;
- 方便对其他用户表的访问;
- 简化过长的对象名称;
- 节省大量的数据库空间,对不同用户的操作同一张表没 有多少差别;
- 扩展的数据库的使用范围,能够在不同的数据库用户之 间实现无缝交互;
- 同义词可以创建在不同一个数据库服务器上,通过网络 实现连接;
CREATE [PUBLIC] synonym 同义词
FOR [schema.]对象名;
CREATE synonym em FOR emp;
# PRIVATE 是在指定的方案中创建的,并且只允许拥有它的方案访问
# PUBLIC 由PUBLIC方案所拥有,所有的数据库方案都可以引用他们 方案都可以引用他们
列 (字段)
ALTER TABLE 表名 ADD (列名 数据类型[DEFAULT 默认值] [,列名 数据类型]...);
ALTER TABLE emp add (age number(8,2) DEFAULT 0);
约束
ALTER TABLE 表名 ADD [CONSTRAINT 约束名字] 约束类型 (受约束影响的列的名字);
# 为emp的字段id添加名为emp_fk的,参照的是dept的deptno的数据
ALTER TABLE emp add CONSTRAINT emp_fk FOREIGN KEY (id) REFERENCES dept (deptno) ON DELETE CASCADE;
注:无ON DELETE CASCADE 或 ON DELETE SET NULL选项,当附表中的行被删除时,如果父表中的行在子表中被引用,则提 示不能被删除。
事务保存点
如果在一个事务内,想要回滚到指 定位置,不是回滚到事务的起始点,可以通过保存点(SAVEPOINT)来实现
savepoint savepoint_name;
# 回滚到指定保存点
rollback to savepoint_name;
视图
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名称 [(列名[, column]...)]
AS 完整的select语句
[WITH CHECK OPTION [CONSTRAINT 约束名]]
[WITH READ ONLY]
# 使用了函数(avg等函数)的视图需要用别名
CREATE VIEW dd as select avg(..) avgnum ,.... from ...;
# 也可以这样定义别名,要对应select的位置
CREATE VIEW dd(avgnum) as select avg(..) .... from ...;
# OR REPLACE:如果创建的视图已经存在,则修改原视图的定义。
# FORCE:不管视图所基于的表是否存在,都会创建该视图。
# NOFORCE:只有视图所基于的表存在,才会创建该视图。
# WITH CHECK OPTION:一个约束条件,通过视图所插入或修改的数据行必须 满足视图所定义的查询;
# CONSTRAINT:增加约束
# WITH READ ONLY:确保在该视图上不能进行任何DML操作(一般不用,都会默认视图用来查,并不会用它来增删改)
# 注意:列名的数量必须和视图所对应查询语句的列数量相等
序列
序列是按照一定规则能自动增加/减少数字的一种数据库对 象。
通常可以使用序列自动地生成主键值。
CREATE SEQUENCE [schema.] 序列名
[INCREMENT BY n] # 序列连续两个值之间的间隔n,默认为1
[START WITH n] # 序列起始值n该项省略起始值为1
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] # 表示序列在达到最大值或最小值之后是否继续产生序列值,NOCYLE表示不再产生,NOCYLE是默认选项。
[CACHE n | NOCACHE]; # 表示序列值被服务器预先分配并存储在内存中,NOCACHE表示不预先分配并存储,CACHE 20是默认选项
# MAXVALUE n :序列最大值;
# MINVALUE n:序列最小值;
# NOMINVALUE:指定序列无最小值
索引
-
自动创建: 当有PRIMARY KEY 或者UNIQUE 约束时,数据库会自动创建一个索引;
-
手动创建: 用户使用创建索引语法来进行创建;
CREATE [ UNIQUE|BITMAP] index 索引名称
ON 表名 (列名1 ASC|DESC, 表达式 ASC|DESC,…) [REVERSE];
# 建议索引命名格式:idx_表名_列名
适合创建索引情况
- 表数据量很大
- 要查询的结果集在2%-4%左右
- 经常用来做WHERE条件中的列或者多表连接的列
- 查询列的数据范围分布很广
- 查询列中包含大量的NULL值因为空值不包含在索引中
不适合创建索引情况
- 数据量很小的表
- 在查询中不常用来作为查询条件的列
- 频繁更新的表
- 索引列作为表达式的一部分被使用时,比如常查 询的条件是SALARY*12,此时在SALARY列上创建索引是没有效果的
- 查询条件中有单行函数时,用不上索引 查询条件中有单行函数时,用不上索引
索引缺点
- 占用空间;
- 降低DML的操作速度;
插入数据
插入数据之前必须有相应的权限,并且要给表的所属用户设置表空间并分配一定的配额。
insert into 表名 (列名列表) values (值列表)
# 如果省略列名列表,则默认包括所有列。
# 字符和日期类型数据必须要用单引号括起来。
insert into 表名 (列名列表)
子查询
插入日期型数据示例
INSERT INTO 表名 VALUES (2296,'AROMANO','SALESMAN',7782,TO_DATE('1997-2-3','YYYY-M-DD'),1300, NULL, 10);
# 月份为...月的时候,用mon
insert into student values('A001','张三','男',to_date('01-5月-05','yy-mon-dd'),100,1);
# 当要插入的日期格式为‘2000年1月1日’时
insert into student values('A001','张三','男',to_date('2000年1月1日','yyyy"年"m"月"d"日"'),100,1);
-
注意:
如果没有指定年份而是只给了第几年,则默认会是当前系统的年份。
例如:你想的是1988年但是只给了88,那么Oracle将默认会是2088