创建和管理表

  • 表空间的概念:一个或多个数据文件的逻辑集合

  • 表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都的存放在指定的表空间中。但主要存储的是表,所以称为表空间

  • Oracle数据库中至少存储一个表空间,即SYSTEM的表空间

  • SQL Server数据库与Oracle数据库之间最大的区别要属表空间设计。Oracle数据库开创性地提出了表空间的设计理念,这为Oracle数据库的高性能做出了不可磨灭的贡献。可以这么说,Oracle中很多优化都是基于表空间的设计理念而实现的。

表空间的作用

  • 控制用户所占用的表空间配额
  • 控制数据库所占有的磁盘空间
  • 灵活放置表空间,提高数据库的输入输出性能
  • 大表的排序操作
  • 日志文件与数据文件分开放,提高数据库安全性

表空间分类

  • 永久表空间:存储数据库中需要永久化存储的对象,比如二维表、视图、存储过程和索引
  • 临时表空间:存储数据库的中间执行过程,如:保存order by 数据库排序,分组时产生的临时数据。操作完成后存储的内容会被自动释放。临时表空间是通用的,所有的用户都是用temp作为临时表空间。一般只有tmp一个临时表空间,如果还需要别的临时表空间时,可以自己创建
  • UNDD表空间:保存数据修改前的副本。存储事务所修改的旧址,即被修改之前的数据。当我们对一张表中的数据进行修改的同时会对修改之前的信息进行保存,为了对数据执行回滚、恢复、撤销的操作

创建表空间

  • 创建表空间用来存储数据
-- 创建表空间(指定表空间对应的datafile文件的具体的路径:'F:\oradata\orcl\qyt.dbf')
CREATE TABLESPACE qyt DATAFILE 'F:\oradata\orcl\qyt.dbf' SIZE 100m AUTOEXTEND ON NEXT 10m
  • 删除表空间
    • 从数据字典中删除表空间
    • 内容从数据字典中移走
    • 加上AND DATAFILES子句选项的话物理文件可以一起删除:
DROP TABLESPACE qyt INCLUDING CONTENTS AND DATAFILES
  • 查询所有的表空间
    SELECT DISTINCT TABLESPACE_NAME FROM dba_free_space

Oracle数据类型

数据类型 描述
VARCHAR2(size) 可变长度字符数据
CHAR(size) 固定长度字符数据
NUMBER(p, s) 可变长度数字数据
DATE 日期和事件数值
LONG 可变长度字符数据,最大到2GB
GLOB 字符数据,最大到4GB
RAW and LONG RAW 原始二进制数
BLOB 二进制数,最大到4GB
BFTLE 存储到外部文件中的二进制数;最大到4GB
ROWID 表示行在表中的唯一地址

常用数据类型

  • 数值型
    • number(

      )

    • Integer/int number(38)
    • 在定义整数类型的时候,可以直接使用number的子类型int
    • float
  • 日期型
    • date 默认格式为:DD-MON-YY
    • timestamp:[秒小数位数] date的扩展
  • 字符型:
    • char() 1..2000(以字节为单位) 占用空间固定
    • varchar() 1..4000 占用空间可变化
    • varchar2() 1..4000 占用空间可变化
    • long 2G

char、varchar、varchar2的区别

  • char的长度是固定的,而varchar2的长度是可以变化的,比如,存储字符串"abc",对于char(20),表示存储的字符将占20个字节的长度,20只是最大值,当存储的字符小于20时,按实际长度存储
  • char的效率比varchar2的效率稍高
  • 目前varchar是varchar2的同义词。工业标准的varchar类型可以存储空字符串,但是Oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型varchar2,这个类型不是一个标准的varchar,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。假如你想有向后兼容的能力,Oracle建议使用varchar2而不是varchar
  • 何时该用char,何时该用varchar2?
    • char与varchar2是一对矛盾的统一体,两者是互补的关系。varchar2比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的"以空间换效率"
    • varchar2虽然比char节省空间,但是假如一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起"行迁移"(Row Migration)现象,而这会造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar2会更好一些

SQL语句分类

  • 在Oracle数据库中,SQL语句主要可以划分为以下几类:
    • DDL(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引)的操作
    • DML(Data Manipulation Language):数据操作语言,定义对数据库记录的操作
      • INSERT、DELETE、UPDATE
    • DQL(Data Query Language):数据查询语言,定义对数据库记录的查询操作
      • SELECT
    • DCL(Data Control Language):数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别
      • GRANT、REVOKE等
    • Transaction Control:事务控制
      • COMMI、ROLLBACK、SAVEPOINT等

SQL语句的书写规范

  • 在数据库系统中,SQL语句不区分大小写(建议用大写)
  • 但字符串常量区分大小写
  • SQL语句可单行或多行书写,以";"结尾
  • 关键词不能跨多行或简写
  • 用空格和缩进来提高语句的可读性
  • 子句通常未于独立行,便于编辑,提高可读性
    • SELECT * FROM tb_user
  • 注释
    • SQL标准:
      • /**/:多行注释
      • "--":单行注释

CREATE TABLE语句

  • 语法:
CREATE TABLE tb_name(column_name datatype)
-- 注意:必须拥有CREATE TABLE特权

表名命名规则

  • 必须以字母开头
  • 字符长度在1-30之间
  • 只能包含A-Z,a-z,0-9,_,$和#
  • 被同一个用户拥有的对象不能有重复的名字
  • 不能是Oracle服务器保留字

创建表

  • 创建表
create table dept(
  deptno NUMBER(2),
  deptName VARCHAR2(14),
  loc VARCHAR2(13)
);
  • 确定表的创建
DESCRIDE dept;

使用子查询语法创建一个表

  • 综合CREATE TABLE语句和AS subquery选项创建一个表并插入行
CREATE TABLE table_name
  [(column1,column2...)]
AS subquery;
  • 指定列的数字和子查询列的数量相匹配
  • 使用列名和默认值定义列

使用子查询创建一个表

  • 使用子查询创建一张新表
CREATE TABLE tb_emp AS SELECT * FROM scott.emp

ALTER TABLE语句

  • 如果表结构不符合实际情况,那么在建表后,可以使用alter table语句改变表结构,例如增加列、改变列定义、删除列等
  • 删除新的一列
  • 修改已经存在的列
  • 为新列定义一个默认的值
  • 删除一列

ALTER TABLE语句

  • 使用ALTER TABLE语句增加,修改或者删除行。假如只是增加或修改一列,可以不加()。drop就算只有一列都应该加()。

    ALTER TABLE语句

  • 示例:

alter table admin modify (name varchar2(20) default null, password varchar2(20));

-- 1列或者2列的时候都是可以加括号的
alter table admin modify (name varchar2(25)); 

alter table admin drop (name, password);
-- drop 的时候假如有多列那么应该加()

alter table tb_test modify sex varchar2(10) default '男';

alter table tb_test drop (age, creater);

增加一列

  • 使用ADD子句增加字段
  • 新的字段只能被加到整个表的最后
    ADD增加字段
  • 示例
alter table dept ADD(job_id varchar2(9));

新的列变成最后一列

修改一列

  • 可以改变一列的数据类型、大小和默认值。不是任何情况都可以修改,当字段只包含空值时,类型、大小都可以修改,否则修改可能不能成功
alter table dept MODIFY(last_name varchar2(30))
  • 默认值的改变只会影响后面的插入操作

修改列名

  • 如果觉得列名不合适,那么可以使用alter table语句的rename column 子句改变列名
alter table table_name rename column old_column_name to new_column_name;

删除一列

  • 如果在一张表中不再需要一列,可以使用DROP COLUMN
  • 删除该列,与上面定义方式不一样,这里多了一个
  • drop column
alter table dept DROP COLUMN job_id;
  • 从每行中删除掉字段占据的长度和数据,释放在数据块中占用的空间
  • 删除大表中的字段将需要比较长的时间,因为还需要回收空间

修改表名

  • 改变表、视图、序列或者同义字的名称,可以执行RENAME语句
RENAME dept TO tb_dept;
-- 必须是对象的拥有者

增加表注释

  • 当开发数据库应用程序的时候,为了描述表,列的作用,可以comment语句为表和列增加注释
-- 为表添加注释
comment on table tablename is 'text';
-- 为列添加注释
comment on column table.column is 'text';

-- e.g
comment on table emp is '这是员工表';
comment on column emp.ename is '这是员工姓名';

删除一张表

  • 表中的数据和结构会被删除
  • 任何未决的事务被提交
  • 所有的索引被删除
  • 不能回滚DROP TABLE语句
-- 删除dept表
DROP TABLE dept;

恢复被删除表

  • 在执行DROP TABLE语句的时候,Oracle会将被删除表存放到数据库回收站中,从Oracle 10g开始,使用FLASHBACK TABLE可以快速恢复被删除表
-- 恢复被删除的表
FLASHBACK TABLE table_name TO BEFORE DROP;

截断表

  • 当表结构必须保留,而表数据不再需要的时候
  • TRUNCATE TABLE语句
    • 删除表中所有的行
    • 释放被表占用的存储空间
-- 截断表,删除表中所有数据
TRUNCATE TABLE dept;
  • 当使用TRUNCATE时不能回滚行删除
  • 作为选择,可以使用DELETE语句删除行

Oracle数据库中的表

  • 用户表
    • 由用户创建和维护的表的集合
    • 包含用户信息
  • 数据字典
    • 由Oracle服务器创建和维护的表的集合
    • 包含数据库信息

你可能感兴趣的:(创建和管理表)