`
fehly
  • 浏览: 248355 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DDL与数据库对象

阅读更多

数据库对象

常见数据库对象

  • 表:存放数据的基本数据库对象,由行(记录)和列(字段)组成
  • 约束条件:执行数据校验,保证数据完整性的系列规则
  • 视图:表中数据的逻辑显示
  • 索引:根据表中指定的字段建立起来的顺序,用于提供查询性能
  • 序列:一组有规律的整数值
  • 同义词:对象的别名

命名规则:

  • 必须以字母开头
  • 可以包含字母,数字,_,$,和#
  • 同一方案(用户)下的对象不能重名
  • 不能使用Oracle的保留字

创建表

创建表的前提条件

具备创建表的权限

有可用的存储空间

创建表语法

create table [schema.]table (column datatype[default expr][,...]);
-----------------------------------------------------------------
create table scott.test1(
     eid number(10),
     name varchar2(20),
     hiredate date default sysdate,
     salary number(8,2) default 0
);

说明: 

创建表时必须指定表名,字段名,字段类型

create table为DDL语句,一经执行不可撤销

使用子查询创建表

在创建表的同时,可以将子查询的结果直接插入其中:

新建表与子查询结果的字段列表必须匹配

新建表的字段列表可以缺省

语法格式

create table [schema.] table (column[,...])
as subquery;
----------------------------------------------
create table myemp(编号,姓名,年薪)
as select empno,ename,sal*12 from emp;
----------------------------------------------
create table myemp(编号,姓名,年薪)
as select empno,ename,sal*12 annsal from emp;

修改表结构

使用alter table 语句可以修改表的结构,包括:

添加字段

修改字段

删除字段

alter语句为DDL语句,一经执行不可撤销

添加字段

在alter table语句中,使用add子句添加新字段,新字段只能被加到整个表的最后。

语法:

alter table table
add (column datatype [default expr] [,column datatype]...);
-----------------------------------------------------------
alter table test1
add(
   grade number(3),
   phone varchar2(20) default '无'
);

 修改字段

在alter table语句中,使用modify子句修改现有字段,包括字段的数据类型,大小和默认值.

语法:

alter table table
modify (column datatype [default expr] [,column datatype]...);
--------------------------------------------------------------
alter table test1
modify(
   grade number(2),
   phone varchar2(15) default '021-12212121'
);

说明: 

修改操作会受到当前表中已有数据的影响——当已有记录的相应字段只包含空值,类型,大小都可以修改,否则修改可能失败.

修改的缺省值设置,只对此后新插入的记录有效

删除字段

在alter table 语句中,使用drop子句删除字段——从每行中删除掉该字段占据的长度和数据,释放在数据库中占用的存储空间.

语法:

alter table table
drop(column[,column]...);
---------------------------------------------------
alter table test1
drop(grade,phone);

清空表中数据 

truncate table语句用于清空表中数据:

清楚表中所有记录

释放表的存储空间

为DDL语句,一经执行不可撤销

语法:

truncate table table;
------------------------------------------------------------------
truncate table test1;

删除表 

drop table语句用于删除表:

表中所有数据将被删除

此前未完成的事务将被提交

所有相关的索引被删除

为DDL语句,一经执行不可撤销

语法:

drop table table;
--------------------------------------------------------------------
drop table test1;

重命名表 

使用rename语句可以改变现有表的名称

也可修改其他数据库对象(视图,序列,同义词等)的名称

执行重命名操作的必须是对象的所有者

为DDL语句,一经执行不可撤销

语法:

rename old_name to new name;
-------------------------------------------------------
rename test1 to test00;

Oracle数据库中的表

用户定义的表

用户自己创建并维护的一组表

包含了用户所需的信息

数据字典表

由Oracle数据库自动创建并维护的一组表

包含数据库信息

数据字典

什么事数据字典

数据字典是Oracle数据库的核心,用于描述数据库及其所有对象.

数据字典由一系列只读的表盒视图组成,这些表盒视图属sys用户用于,由Oracle server负责维护,用户可以通过select语句进行访问.

数据字典的内容

数据库的物理和逻辑结构

对象的定义和空间分配

完整性约束条件

用户

角色

权限

审计记录

数据字典视图主要可分为三类

dba.所有反感包含的对象信息

all.用户可以访问的对象信息

user.用户方案的对象信息

举例:

--查看当前用户拥有的所有表的名字
select table_name from user_tables;

--查看当前用户可以访问的所有表的名字
select table_name from all_tables;

--查看当前用户拥有的所有对象的类型
select distinct object_type from user_objects;

--查看所有用户拥有的所有对象的类型
select table_name from dba_tables;

约束

约束(Constraint)是在表上强制执行的数据校验规则,用于保护数据的完整性,具体包括如下五种:

  • not null                       (非空)
  • unique key                 (唯一键)
  • primary key               (主键)
  • foreign key                (外键)
  • check                          (检查)

相关说明

Oracle 使用SYS_Cn格式命名约束,也可以由用户命名

创建约束的时机

  • 在建表的同时创建
  • 建表后单独添加

可以在表级或列级定义约束

可以通过数据字典视图查看约束

建表的同时创建约束

语法格式

create table [schema.] table(
            column datatype [defaule expr] [column_constraint],
            ...
            [table_constraints]
);

非空约束(not null)

非空约束特点

确保字段值不能为空(null)

只能在字段级定义

create table student(
         sid number(3) not null,
         name varchar2(20),
         birth date constraint student_birth_nn not null
);

唯一性约束(unique) 

唯一性约束特点:

唯一性约束用于确保所在的字段(或字段组合)不出现重复值

唯一性约束字段允许出现空值

Oracle会自动为唯一性约束创建对应的唯一性索引

唯一性约束既可以在字段级定义,也可以在表级定义

create table student(
        sid number(3) unique,
        name varchar2(20)
);
----------------------------------------------------
create table student(
        sid number(3),
        name varchar2(20),
        constraint student_sid_un unique(sid)
);

主键约束(primary key)

 主键约束特点:

  • 主键用于唯一标示表中的某一行记录,功能上相当于非空且唯一
  • 一个表中只允许一个主键,主键可以是单个字段或多字段的组合
  • Oracle会自动为主键字段创建对应的唯一性索引
  • 主键约束既可以在字段级定义,也可以在表级定义
create table student(
        sid number(3) primary key,
        name varchar2(20)
);
---------------------------------------------------
create table student(
        sid number(3),
        name varchar2(20),
        constraint student_sid_pk primary key(sid)
);

 联合主键:

  • 由多个字段组合而成的主键也称为联合主键
  • 联合主键中每一个字段都不能为空
  • 联合主键字段组合的值不能出现重复
  • 联合主键只能定义为表级约束
create table record(
        student_id number(3),
        subject_id varchar2(20),
        record number(3),
        constraint record_stuId_subId_pk primary key(student_id,subject_id)
);

外键约束(foreign key)

外键约束特点:

  • 外键用于确保相关的两个字段之间的参照关系,以实现参照完整性约束;
  • 外键约束通常构建于来自不同的两个字段之间
  • 子表外键列的值必须在主表参照列植的范围内,或者为空;
  • 外键参照的必须是主表的主键或者唯一键;
  • 主表主键/唯一键值被子表参照时,主表相应记录不允许被删除;
create table empinfo(
           eid number(3) primary key,
           ename varchar2(20),
           job varchaer2(20),
           birth date
);
--------------------------------------------------------------
create table salary(
           eid number(3)  primary key,
           basic_salary number(8,2),
           job_allowance number(8,2),
           travelling_allowance number(8,2),
           personal_income_tax number(8,2),
           constraint salary_eid_fk foreign key(eid) references empinfo(eid)
);
--------------------------------------------------------------
create table salary(
           eid number(3) primary key references empinfo(eid),
           ...
);

检查约束(check)

检查约束特点:

  • 定义每一行(的指定字段)都必须满足的条件
  • 以条件表达式的形式给出数据需要符合的条件
  • 只能在字段级定义

条件表达式中不允许出现如下内容:

  • currval,nextval,level,rownum等伪列
  • sysdate,uid,user,userenv等函数
  • 对其它字段值的引用
create table test1(
          name varchar2(20),
          age number(3) check(age>=0 and age<=120)
);

域完整性约束: not null, check

实体完整性约束: unique,primary key

参照完整性约束:foreign key

查看约束

查询用户字典视图user_constrains

可得到用户的所有约束

查询用户字典视图user_cons_columns

可获知约束建立在那些字段上

建表后添加约束

基本语法

alter table table
add[constraint constraint_name] constraint_type(column);
----------------------------------------------------------------------------------
create table student(
          sid number(10),
          name varchar2(20)
);
alter table student
add constraint student_sid_pk primary key(sid);

特例:非空约束必须使用modify子句添加

alter table student
modify(name char(15) default 'n/a' not null)

删除约束

基本语法 

alter table table
drop constraint constraint_name;
-------------------------------------------------------------------------------------
create table student(
           sid number(10),
           name varchar2(20),
           constraint student_sid_pk primary key(sid)
);
alter table studnet drop constraint studnet_sid_pk;

删除主键约束的另一种方式:

alter table table drop primary key;
------------------------------------------------------------------
alter table student drop primary key;

删除级联约束

在删除约束是,如果还存在与该约束相关的其他约束则删除操作会失败,此时可使用cascade子句将其他关联约束一并删除.

alter table table
drop constraint constraint_name[cascade];
------------------------------------------------
create table empinfo(
   eid number(3) constraints empinfo_eid_pk primary key,
   ename varchar2(20)
   ...
);
------------------------------------------------
create table salary(
    eid number(3) references empinfo(eid)
    ...
);
------------------------------------------------
alter table empinfo
drop constraints empinfo_eid_pk cascade;

在删除表中字段时,如果该字段处于多字段联合约束条件(联合主键,联合唯一键,存在参照当前字段的外键)中,则删除会失败,此时可使用cascade constraints子句将与该字段相关的约束一并删除.

alter table table
drop (column[,column]...) cascade constraints;
-------------------------------------------------
create table record(
        student_id number(3),
        subject_id varchar2(20),
        record number(3),
        constraint record_stuId_pk primary key(student_id,subject_id)
);
alter table record
drop (student_id) cascade constraints;

禁用约束

在alter table语句中,还可适应disable constraint子句禁用已有约束.

也可以使用cascade选项将相关联的约束一并禁用.

alter table table
disable constraint constraint_name[cascade];
---------------------------------------------------------
create table student(
         sid number(10),
         name varchar2(20),
         constraint student_sid_pk primary key(sid)
);
alter table student
disable constraint student_sid_pk;

启用约束

在alter table语句中,可使用enable constraint子句启用先前被禁用的约束.

alter table table
enable constraint constraint_name[cascade];
---------------------------------------------------------
create table student(
         sid number(10),
         name varchar2(20),
         constraint student_sid_pk primary key(sid)
);
alter table student disable constraint student_sid_pk;

alter table student enable constraint student_sid_pk;

说明:

和关闭约束操作的情况有所不同,此时无法再使用cascade选项一并启用相关的其它约束.

视图

什么是视图(view)?

  • 视图由一个或多个表(或视图)中提取数据而成
  • 视图是一种虚拟表
  • 视图一经创建,可以当做表来使用.

使用视图的好处

  • 简化复杂数据查询
  • 提高运行效率
  • 屏蔽数据库表结构,实现数据逻辑独立性
  • 限制数据访问
  • 在相同数据上提高不同的视图,便于数据共享

创建/删除视图

创建视图

  • 通过在create view语句中嵌入子查询的方式创建视图
  • 基本语法:
create [or replace] view [schema.] view [(alias[,aliasx]...)]
as subquery;
----------------------------------------------------------
create or replace view myview(编号,姓名,职位,工资)
as select empno,ename,job,salfrom emp where deptno=20;

查看视图结构

desc myview;

删除视图

drop view myview;

查询视图

select * from myview;

强制创建视图

可使用force选项强制创建视图

语法格式

create [or replace] [force | noforce] view [schema.] view [(alias[,aliasx]...)]
as subquery;
------------------------------------------------------------------
create or replace force view myview
as select empno,ename,job,sal from emp where depton = 20;

更新视图

在可更新视图上进行DML操作,可以修改基表中数据 

  • 可更新视图的定义中不能使用分组函数,group by 子句,distinct关键字,rownum伪列,字段的定义不能为表达式....
  • 由两个以上基表中导出的视图不可更新
  • 基表非空的列在视图定义中未包括,则不可在视图上进行insert操作...

在视图上进行DML操作,语法与在表上操作相同

  • inset
  • update
  • delete

创建只读视图

在创建视图时,可使用with read only 选项将之设置为只读

create [or replace] [force | noforce] view [schema.] view [(alias[,aliasx]...)]
as subquery
[with read only];
---------------------------------------------------------------------------------
create or replace force view myview
as select empno,ename,job,salfrom emp where deptno=20
with read only;

临时视图

嵌入到sql语句中的子查询是临时视图

临时视图不是数据库对象,其定义不会长久保持在数据库中,本次运行后即被清除.

create table myemp(编号,姓名,年薪)
as select empno,ename,sal*12 from emp;
----------------------------------------------------------
select rownum,a.*
from (select * from emp order by sal)a
where rownum<=5;

索引

什么是索引(Index)?

  • 一种用于提升查询效率的数据库对象;
  • 通过快速定位数据的方法,减少磁盘I/O操作;
  • 索引信息与表独立存放;
  • Oracle数据库自动使用和维护索引.

索引分类

  • 唯一性索引
  • 非唯一索引

创建索引的两种方式

  • 自动创建--在定义主键或唯一键约束时系统会自动在相应的字段上创建唯一性索引。
  • 手动创建--用户可以在其它列上创建非唯一的索引,以加速查询.

创建/删除索引

可使用create index语句手动创建索引

create index [schema.] index
on table (column[,column]...);
---------------------------------------
create index myindex
on emp(ename);

删除索引

  • 使用drop index语句删除索引
  • 操作者须是索引的所有者,或拥有drop该index的权限
  • 删除表时相关的索引(和约束)将被自动删除,但视图和序列将保留
drop index myindex;

创建索引的原则

下述情况可以创建索引

  • 字段取值分布范围很广
  • 字段中包含大量空值
  • 字段经常出现在where子句或链接条件中
  • 表经常被访问,数据流很大,且通常每次访问的数据量小于记录总量的2%-4%

下列情况不适合创建索引

  • 表很小
  • 字段不经常出现在where子句中
  • 每次访问的数据量大于记录总数的2%-4%
  • 表经常更新
  • 被索引的字段作为表达式的一部分被引用

查看索引

查询用户字典视图user_indexes

可得到用户的所有索引

查询用户字典视图user_ind_columns

可获知索引建立在那些字段上

基于函数的索引

基于表达式的索引被统称为基于函数的索引--索引表达式由表中的字段,变量,sql函数和自定义函数构建而成.

创建函数索引

create index[schema.] index
on table (function(column));
------------------------------------------------------------
create index myindex
on emp(lower(ename));

使用函数索引

select * from emp
where lower(ename)='king';

序列

什么事序列(Sequence)?

  • 系统自动生成的,不重复的整数值
  • 序列是一种数据库对象,可以被多个用户共享
  • 典型用图是做为主键值,它对于每一行必须是唯一的
  • 序列可以代替应用程序编号
  • 可以对序列值进行缓冲存储,以提高访问效率.

创建序列

使用create sequence语句创建序列

create sequence [schema.]sequence
[increment by n]
[start with n]
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocache}]
[{order | noorder}];
--------------------------------------------------------
create sequence mysequence1
increment by 1
start with 1
nomaxvalue nocycle;
--------------------------------------------------------
create sequence mysequence2;

查询数据字典视图user_sequences可获得用户序列信息

使用序列

nextval/currval伪列

  • nextval伪列用于从指定的序列数值中取出下一个值
  • currval伪列引用的是指定序列的"当前值"

语法格式

select mysequence1.currval from dual;
select mysequence1.nextval from dual;
insert into test1 values(mysequence1.nextval,'Tom');

说明: 

使用缓存(cache n)可提高访问效率

序列在下列情况下可能出现不连续的情况:

  • 回滚
  • 系统异常
  • 多个表同时使用同一序列

使用nocache和order设置会降低运行效率

修改序列

语法格式

alter sequence [schema.]sequence
[increment by n]
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocache}]
[{order | noorder}];

注意事项:

  • 操作者必须是序列的所有者,或者拥有alter该序列的权限;
  • 只有未来再生成的序列数受影响;
  • 序列的初始值不可更改
  • 更改中会进行一些验证,比如新的maxvalue如果小于当前的序列值就会报错.

删除序列

删除序列

  • 使用drop sequence语句删除序列
  • 操作者是序列的所有者,或拥有drop该sequence的权限.

同义词

同义词相当对象的别名,使用同义词可以:

  • 方便访问其他用户的对象
  • 缩短对象名字的长度

创建同义词

create [public] synonym synonym
for object;
------------------------------------------------
create synonym gt1 for emp;

使用同义词

select * from gt1;

删除同义词

drop synonym gt1;

 

分享到:
评论

相关推荐

    v512工作室_张利国_Java高端培训系列教材_Oracle实用教程_07章_DDL与数据库对象

    ### Oracle实用教程_07章_DDL与数据库对象 #### 概述 本章节主要针对Oracle 10g数据库中的DDL(Data Definition Language)及数据库对象进行深入探讨。Oracle数据库对象是构成数据库的重要组成部分,包括但不限于表...

    A07_DDL与Oracle数据库对象.pptx

    A07_DDL与Oracle数据库对象.pptx

    数据库文档生成器,根据数据库表DDL生成markdown和word文档.zip

    首先,DDL是SQL语言的一部分,用于创建和修改数据库对象如表、视图、索引等。在项目开发中,清晰、规范的DDL文档对于团队协作至关重要,因为它可以清晰地展示数据库的架构,包括字段名、数据类型、约束条件等。而...

    Oracle中提取和存储数据库对象的DDL

    Oracle 中提取和存储数据库对象的 DDL Oracle 中提取和存储数据库对象的 DDL 是一种常见的数据库操作,涉及到从数据库对象(例如数据库表、索引、约束、触发器等)中提取元数据(metadata),并把这些数据存储在...

    张立国oracle数据库教程

    第五章“DDL与数据库对象”讲解了数据定义语言(DDL)的应用,包括创建、修改和删除表、视图、索引、存储过程等数据库对象。这一章还将涵盖约束(如NOT NULL、UNIQUE和FOREIGN KEY)的设置,以及如何管理表空间和段...

    从Access数据库建立DDL语句

    DDL(Data Definition Language)是SQL语言的一部分,用于定义数据库的结构,如创建、修改或删除数据库对象如表格、索引等。本文将详细介绍如何使用Access来生成DDL语句,以及这一过程中的关键知识点。 首先,DDL...

    第八章 DDL语句和常见得数据库对象.sql

    第八章 DDL语句和常见得数据库对象.sql

    oracle数据库对象导出脚本

    ### Oracle数据库对象导出脚本知识点解析 #### 标题:Oracle数据库对象导出脚本 此标题指明了本文档的主题是关于如何通过编写脚本来导出Oracle数据库中的对象定义。在Oracle数据库中,对象是指数据库表、视图、...

    从excel模版生成数据库表DDL,excel设计mysql,excel设计表格模板转成mysql表文件,

    DDL是SQL语言的一部分,主要用于定义数据库模式,包括创建、修改和删除数据库对象如表、视图、索引等。在Excel中设计好表格模版后,通过宏可以生成对应的CREATE TABLE语句,这些语句可以直接在MySQL环境中执行,创建...

    DB2数据库SQL语法(DDL,DML以及插入优化)

    DDL是SQL的一部分,用于创建和修改数据库对象,如表格、视图、索引等。在DB2中,以下是一些常见的DDL语句: 1. 创建表格: `CREATE TABLE table_name (column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY], ...

    DB2数据库对象基础知识.docx

    ### DB2数据库对象基础知识 #### 一、数据库对象概述 在DB2中,数据库对象是构建数据库的基础单元,它们能够帮助我们有效地组织、管理和访问数据。通过数据定义语言(DDL)可以实现对这些对象的创建、修改和删除...

    数据库_ddl_

    DDL语句包括创建、修改和删除数据库对象,如表格、视图、索引等。在这个压缩包文件中,我们可以找到与DDL相关的知识资源,帮助我们更好地理解和操作数据库。 `university.pdf` 可能是一份关于数据库设计或大学...

    实训 sql 关系数据库实训练习含答案,DML语句及DDL语句.doc

    在本实训中,我们还学习了如何使用 DDL 和 DML 语句来创建和修改数据库对象,并且使用视图来查询和操作数据。例如: create table 病人表(ID int, 姓名 varchar(20), 出生日期 smalldatetime, 性别 char(1)) create...

    数据库实验报告 Transact的数据定义语言DDL

    在这个实验报告中,我们将探讨如何使用Transact-SQL的DDL语句来构建和管理数据库对象。 一、实验目的 本实验旨在让学生熟练掌握Transact-SQL的使用,包括创建和管理数据库、表、索引,以及修改表结构。此外,还要求...

    数据库DDL实战精华

    数据库DDL(Data Definition Language)是用于创建、修改和删除数据库对象的SQL命令。在本文档中,作者分享了关于数据库DDL的实际操作经验,主要涵盖了创建(CREATE)、删除(DROP)和修改(ALTER)表的技巧,特别...

    C#实现系统并与数据库操作

    9. 数据库设计:理解关系数据库的基本原理,如ER模型、范式理论,以及SQL语言的DDL(Data Definition Language)和DML(Data Manipulation Language),对于有效地设计和操作数据库至关重要。 10. 错误处理与性能...

    西南交通大学第四章-数据库作业.docx

    3. **SQL语言对数据库对象的定义使用哪三个SQL命令关键字?** - `CREATE`: 用于创建新的数据库对象。 - `ALTER`: 用于修改已存在的数据库对象结构。 - `DROP`: 用于删除数据库对象。 4. **标准的SQL语言与实际...

    DDL与DML详解

    1. `CREATE`:用于创建新的数据库对象,如表、视图、索引、用户、角色等。 2. `ALTER`:用于修改已存在的数据库对象,例如增加或删除表的列、更改索引类型等。 3. `DROP`:用于删除不再需要的数据库对象,如表、索引...

    西南交大数据库设计实验,DDL+DML+DCL报告

    3、编写DDL语句完成数据库对象的创建(各自在自己的机器上完成) (1)创建数据库 ,写出DDL语句; (2)创建各关系,写出DDL语句,每个关系必须标注主键,至少为4张关系中的列设计Check检查约束,关系用自己的学号+...

    SQLplus&数据库对象

    - **DDL(Data Definition Language)**:用于创建、修改和删除数据库对象。 - **DCL(Data Control Language)**:用于权限和访问控制。 SQL中的一些基本运算和比较符号包括加减乘除(`+ - * /`)、等于(`=、!=、...

Global site tag (gtag.js) - Google Analytics