1.数据库对象
对象 描述
表 存储数据的基本单元,由行和列组成
视图 来自一个或多个表的数据的子集
序列 产生关键字值
索引 提高某些查询的性能的数据结构
同义词 赋予对象另外的名字
2.CREATE TABLE语句
必须具备:
-CREATE TABLE的权限
-一定的存储空间
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[,column datetype [DEFAULT expr]]...);
需要指定:
-表名
-列名、列的类型及列的宽度
1)表和列的命名规则
-必须以字母开头
-长度为1-30个字符
-只能包含A-Z,a-z,0-9,_,$和#
-对于同一个用户不能使用和其他对象相同的名字
-不能是Oracle的保留字
-名字是不区分大小写的
-在不同的表中命名相同的实体采用保持一致的原则
2)引用其他用户的表
-属于其他用户而不属于当前用户的表
-需使用用户名作为表的前缀
3)DEFAULT选项
-指定在插入数据时,列的默认值
...hiredate DATE DEFAULT SYSDATE,...
-合法的值可以是字面值、表达式或SQL函数
-非法的值是另一个列的名称或虚拟列
-默认的数据类型必须和列的类型匹配
4)数据类型
类型 描述
VARCHAR2(size) 变长字符串
CHAR(size) 固定长度字符串
NUMBER(p,s) 变长数值
DATE 日期和时间值
LONG 可存放高达2GB的变长字符数据
CLOB 可存放高达4GB的变长数据
RAW and LONG RAW 二进制数据
BLOB 可存放高达4GB的二进制数据
5)创建表
例:CREATE TABLE dept1
(deptno NUMBER(3,2),
dname VARCHAR2(2));
验证:DESC dept1
结果:
名称 是否为空? 类型
DEPTNO NUMBER(3,2)
DNAME VARCHAR2(2)
6)数据库中的表
-用户表(用户拥有)
-数据字典表(SYS用户拥有)
-USER_XXX:记录当前用户拥有的对象
-ALL_XXX:记录可被当前用户访问的对象
-DBA_XXX:记录数据库所有的对象
-V$_XXX:记录数据库的动态性能数据
例1:列出当前用户的表
SELECT table_name
FROM user_tables;
结果:
TABLE_NAME
BONUS
COPY_DEPT
DEPT
DEPT1
EMP
SALGRADE
例2:列出当前用户不同的对象类型
SELECT DISTINCT object_type
FROM user_objects;
结果:
OBJECT_TYPE
INDEX
TABLE
例3:查询当前用户的表、视图、同义词及序列
SELECT *
FROM user_catalog;
结果:
TABLE_NAME TABLE_TYPE
BONUS TABLE
COPY_DEPT TABLE
DEPT TABLE
DEPT1 TABLE
EMP TABLE
SALGRADE TABLE
7)用子查询创建表
CREATE TABLE table
[column(,column...)]
AS subquery;
-在CREATE TABLE语句的AS子句中使用子查询可以在创建表的同时插入数据
-所指定列的数量和类型必须和子查询中列的数量和类型相匹配
-如果没有指定要创建表的列,那么创建出的新表的名称和子查询中的各列名相同
-完整性约束不被传递
例:CREATE TABLE dept30
AS
SELECT empno,ename,sal*12 ANNSAL,hiredate
FROM emp
WHERE deptno=30;
验证:DESC dept30
3.ALTER TABLE语句
-使用ALTER TABLE语句可以
-添加一个列
-为新列定义默认值
ALTER TABLE table
ADD (column datatype[DEFAULT expr]
[,column datatype]...);
例:
ALTER TABLE dept30
ADD (job VARCHAR2(9));
-修改已存在的列
ALTER TABLE table
MODIFY (column datetype [DEFAULT expr]
[,column datetype]...);
例:ALTER TABLE dept30
MOIDFY (ename VARCHAR2(15));
-删除一个列
ALTER TABLE table
DROP (column column_name
[,column column_name]...);
例1:ALTER TABLE dept30
DROP column ename;
例2:ALTER TABLE dept30
DROP(ename);
4.SET UNUSED选项
-SET UNUSED信息存储在user_unused_col_tabs视图
1)标记不使用的列:
ALTER TABLE table_name
SET UNUSED COLUMN column_name;
或者:
ALTER TALBE table_name
SET UNUSED(column_name)
2)删除标记为不使用的列
ALTER TABLE table_name
DROP UNUSED COLUMNS;
5.删除表
-表中的所有数据和结构都被删除
-任何悬而未决的事务都将被提交
-所有的索引被删除
-不能回滚该语句
DROP TABLE dept30;
6.修改对象的名称
-要修改表、视图、序列或同义词的名称可以使用RENAME语句
-必须拥有对象的所有权
RENAME dept1 TO department;
7.截断表
-TRUNCATE TABLE 语句
-删除ciao中所有记录
-释放该表的存储空间
-使用TRUNCATE移除后不能回滚
-另一种删除记录的方法可以使用DELETE语句
TRUNCATE TABLE department;
8.给表添加注释
-使用COMMENT语句,可以为表、列、视图、快照添加注释
-可以通过设置空字符串的方式从数据库中删除注释
COMMENT ON TABLE table | COLUMN table.column IS 'text';
例:COMMENT ON TABLE emp
IS 'Employee Information';
注释可以通过以下字典表查询
-ALL_COL_COMMENTS
-USER_COL_COMMENTS
-ALL_TAB_COMMENTS
-USER_TAB_COMMENTS
练习
1.创建如下表(test):
column_name data_type length
ID NUMBER 7
NAME VARCHAR2 2
CREATE TABLE test
(ID NUMBER(7),
NAME VARCHAR2(2));
2.利用emp表来创建test_t表,选取emp表中的empno、ename、job、sal字段
CREATE TABLE test_t
AS SELECT empno,ename,job,sal
FROM emp;
3.更改test_t表的ename字段的长度,由VARCHAR2(10)变为VARCHAR2(20)
ALTER TABLE test_t
MODIFY ename VARCHAR2(20);
4.在test_t表中增加address字段,长度为varchar2(10)
ALTER TABLE test_t
ADD address VARCHAR2(10);
5.将test_t表中的address字段删除
ALTER TABLE test_t
DROP column address;
ALTER TABLE test_t
DROP(address);
6.设置test_t表的sal字段为UNUSED状态,然后将该字段删除
ALTER TABLE test_t
SET UNUSED COLUMN sal;
或:
ALTER TABLE test_t
SET UNUSED(sal);
ALTER TALBE test_t
DROP UNUSED COLUMNS;
7.删除test_t表中的数据
DELETE FROM test_t;
或:
TRUNCATE TABLE test_t;
8.将test_t表重新命名为test
RENAME test_t TO test;
9.删除test表
DROP TABLE test;