--------------------数据库的数据对象-表、约束、视图、索引、序列 ----------------
----------------表---------------------
ORACLE数据库常见数据类型
VARCHAR2\VARCHAR--表示一个字符串NUMBER --NUMBER(N)表示一个整数,数字长度为N ,也可以使用INT
--NUMBER(N,M) 表示一个数,其中小数位数为M
DATE --表示日期类型,日期要按照标准日期格式存放
CLOB --大对象,表示大文本数据,可存放4G
BLOB --大对象,表示二进制数据,最大可以存放4G,如电影,歌曲
DATE --它可以存储月,年,日,世纪,时,分和秒。DATE 数据类型的问题在于它表示两个事件发生时间间隔的度量粒度是秒
TIMESTAMP --它包括了所有DATE 数据类型的年月日时分秒的信息,而且包括了小数秒的信息。
1.创建表
CREATE TABLE 表名(字段名1 字段类型[DEFAULT 默认值],
字段名2 字段类型[DEFAULT 默认值],
字段名3 字段类型[DEFAULT 默认值],
... ... ...
字段名N 字段类型[DEFAULT 默认值],
);
CREATE TABLE 表名 AS (子查询)
说明:当子查询不成立时,如1=2,则只复制表的结构,不复制表的数据。
2.删除表
DROP TABLE 表名;3.修改表的结构
ALTER TABLE 表的名称 ADD(列名称 列的数据类型 DEFAULT 默认值)--给表增加一列
ALTER TABLE 表的名称 DROP COLUMN 列名称;
--删除表的一列
ALTER TABLE 表的名称 MODIFY(列名称 列的类型 DEFAULT 默认);
--如果是更改数据长度,则要求更改时,长度不能小于当前表中对应列具有的最大长度。
--如果是更改数据类型,则要求该列的所有数据为空。
4.重命名表
RENAME 旧名称 TO 新名称;注:这是ORACLE特有的操作。
5.截断表
TRUNCATE TABLE 表名;
意义:清空表中的所有数据,并且立即释放资源,该操作不可回滚。
-----------------约束-----------------------------------------------
---主键约束(PRIMARY KEY )
表示一个唯一的标识,本身不能为空,也不能有重复值主键约束一般在ID上使用,且一张表里只能定义一个主键
1.在表列名后定义主键
CREATE TABLE PERSON(
PID VARCHAR2(18) PRIMARY KEY,
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE,
SEX VARCHAR(2) DEFAULT '男'
);--这种方式系统将默认主键的名字
2.用CONSTRAINT定义主键
CREATE TABLE PERSON(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE,
SEX VARCHAR(2) DEFAULT '男',
CONSTRAINT PERSON_PID_PK PRIMARY KEY(PID)
);
3.在定义表时后面直接定义上主键
CREATE TABLE PERSON(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE,
SEX VARCHAR2(2) DEFAULT '男',
PRIMARY KEY(PID)
);--不过这种方式系统将默认主键的名字
---唯一约束(UNIQUE )
表示一个字段的内容不允许重复,一张表里可以定义多个唯一约束1.
CREATE TABLE PERSON3(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3) UNIQUE,
BRTIHDATE DATE UNIQUE,
SEX VARChar2(2) DEFAULT '男' NOT NULL
);
2.
CREATE TABLE PERSON3(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE,
SEX VARChar2(2) DEFAULT '男' NOT NULL,
CONSTRAINT PERSON3_PID_UK UNIQUE(PID)
);
3.
CREATE TABLE PERSON3(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE,
SEX VARChar2(2) DEFAULT '男' NOT NULL,
UNIQUE(PID)
);
---检查约束(CHECK )
检查一个列的内容是否合法,也可以给多个列同时定义检查约束1.
CREATE TABLE PERSON4(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3) CHECK(AGE BETWEEN 1 AND 150),
BRTIHDATE DATE,
SEX VARChar2(2) DEFAULT '男' NOT NULL
);
2.
CREATE TABLE PERSON4(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3) CHECK(AGE BETWEEN 1 AND 150),
BRTIHDATE DATE,
SEX VARChar2(2) DEFAULT '男' NOT NULL
CONSTRAINT PRESSON_SEX_CK CHECK(SEX IN('男','女'))
);
3.
CREATE TABLE PERSON4(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE,
SEX VARChar2(2) DEFAULT '男' NOT NULL,
CHECK(AGE BETWEEN 1 AND 150)
);
---非空约束(NOT NULL )
限定列不能有空值,一张表中可以给多个列指定非空约束NOT NULL 不能用 CONSTRAINT 来定义
CREATE TABLE PERSON2(
PID VARCHAR2(18),
NAME VARCHAR2(30),
AGE NUMBER(3),
BRTIHDATE DATE NOT NULL,
SEX VARChar2(2) DEFAULT '男' NOT NULL
);
---外键约束(FOREIGN KEY )
在两张之间的操作建立一个PERSON表
CREATE TABLE PERSON(
PID VARCHAR2(18) PRIMARY KEY,
NAME VARCHAR2(30) NOT NULL,
AGE NUMBER(3) CHECK(AGE BETWEEN 1 AND 150),
BRTIHDATE DATE,
SEX VARChar2(2) DEFAULT '男' NOT NULL
);
建立一个BOOK表
CREATE TABLE BOOK(
BID NUMBER(5,2) PRIMARY KEY,
BNAME VARCHAR(30),
PID VARCHAR2(18),
CONSTRAINT PERSON_BOOK_FK FOREIGN KEY(PID) REFERENCES PERSON(PID) [ON DELETE CASCADE]
);
注意事项:
(1)在子表设置外键时必须是父表中的主键
(2)删除表时,要先删除子表,最后删除父表
(3)可以建立级联删除:在建立外键时在其后面加入 ON DELETE CASCADE --只是可以删除数据 ,当删除父表里的数据时子表相应外键连接的数据也会删除。
(4)可以建立级联更新:再建立外键时在其后面加入 ON UPDATE CASCADE --只是可以更新数据。
级联删除的例子:
CREATE TABLE WODE(N NUMBER(10) PRIMARY KEY,M VARCHAR2(10));
CREATE TABLE WODE1(N1 NUMBER(10),
CONSTRAINT WODE_WODE1_FK FOREIGN KEY(N1) REFERENCES WODE(N) ON DELETE CASCADE
)
SELECT * FROM WODE FOR UPDATE;
SELECT * FROM WODE1 FOR UPDATE;
DELETE WODE;--删除WODE 表时,WODE1 与其通过外键连接的数据也会被删除。
----约束的管理
1.增加约束
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段);2.删除约束
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称;----------------------视图 --------
概念:一个视图的实质是封装了一条复杂的SQL优点:
1.为用户集中数据,简化用户的数据查询和处理。
2.屏蔽数据库的复杂性,用户不必了解数据库的复杂性。
3.简化用户权限的管理,只授予用户使用视图的权限。
4.便于数据共享,多个用户不必都定义所需的数据。
5.可以重新组织数据,以便关联到其他应用中。
--创建视图
CREATE VIEW 视图名称 AS 子查询;视图创建后,可以像操作表一样操作视图。
--删除视图
DROP VIEW 视图名称;------------------------序列---------------
--创建序列
CREATE SEQUENCE 序列名称[MAXVALUE NUM 设置序列最大值]
[NOMAXVALUE 不设置序列最大值]
[MINVALUE NUM 设置序列最小值]
[NOMINVALUE 不设置序列最小值]
[INCREMENT BY 设置步长]
[START WITH 开始位]
[CACHE NUM 设置缓存几个序列]
[NOCACHE 不设置缓存]
[CYCLE 到头循环]
[NOCYCLE 一直累加,不循环]
序列的操作
NEXTVAL:取得序列的下一个内容CURRVAL:取得当期序列
序列的应用:生成不一样的ID号。
如:创建一个表
CREATE TABLE STAB(ID1 NUMBER(20));
CREATE SEQUENCE STB INCREMENT BY 1 START WITH 1 NOCYCLE;
INSERT INTO STAB VALUES(TO_CHAR(SYSDATE,'YYYYMMDD')||TRIM(TO_CHAR(STB.NEXTVAL,'0000')));
SELECT * FROM STAB;
------------------ROWNUM 和 ROWID ---------------
ROWID 是表的伪列,它用于惟一标识表行,并且间接给出了表行的物理位置,是定位表行最快的方式,使用 INSERT 语句插入数据时,ORACLE会自动生成 ROWID 并将其值与表数据一起存放到表行中。
ROWNUM 是ORACLE系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2... ... 。
ROWNUM 的应用例子:
--找EMP4COPY 表中工资最大的前五名(空值被默认为最大)
SELECT ROWNUM,S.* FROM (SELECT EMP4COPY.* FROM EMP4COPY ORDER BY SAL DESC) S WHERE ROWNUM<=5;
SELECT * FROM EMP4COPY FOR UPDATE--在此表中插入一个员工号9999,SAL保持为空值;则上面的查询语句最大值的一行为9999
按工资从大到小排名,找后五名:
SELECT ROWNUM,S.* FROM (SELECT EMP4COPY.* FROM EMP4COPY ORDER BY SAL DESC) S
MINUS
SELECT ROWNUM,S.* FROM
(SELECT EMP4COPY.* FROM EMP4COPY
ORDER BY SAL DESC) S,(SELECT COUNT(*) N FROM EMP4COPY) C WHERE ROWNUM<=C.N-5;
或者:按工资从大到小排名,找10名之后的员工信息:
SELECT * FROM (SELECT ROWNUM Q,E.* FROM (SELECT * FROM EMP ORDER BY SAL DESC) E) M
WHERE M.Q BETWEEN 10 AND (SELECT COUNT(*) FROM EMP);
找从第3名到第六名的员工信息:
SELECT * FROM (SELECT ROWNUM Q,E.* FROM (SELECT * FROM EMP ORDER BY SAL DESC) E) M
WHERE M.Q BETWEEN 3 AND 6;
查询表中的记录的前五行
SELECT * FROM EMP WHERE ROWNUM<=5;
第10条记录后的所有员工,如何查?
SELECT * FROM EMP WHERE ROWNUM>10;--这样写是错误的,它不会显示结果