3.2 3.3 数据定义

第三章完整版->有道云笔记

二、SQL功能

以学生-课程数据库为例,定义一个学生-课程模式S-T。包括三个表:

  • 学生表:Student(++Sno++,Sname,Ssex,Sage,Sdept)
  • 课程表:Course(++Cno++,Cname,Cpno,Ccredit)
  • 学生选课表:SC(++Sno,Cno++,Grade)

1.数据定义

  • 模式的定义与删除

要创建模式,需有数据库管理员权限,或获得了数据库管理员授权的CREATE SCHEMA的权限。定义模式实际上定义了一个命名空间,在这个空间里可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引等。

    CREATE SCHEMA<模式名> AUTHORIZATION <用户名>;
     /* 为用户WANG定义了一个学生-课程模式S-T */
     CREATE SCHEMA"S-T" AUTHORIZATION WANG; 
     /* 若没有指定<模式名>,则<模式名>隐含为用户名WANG */
     CREATE SCHEMA AUTHORIZATION WANG; 

创建模式的同时可以在这个模式定义中进一步创建基本表、视图、定义授权。

    CREATE SCHEMA<模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
    /* 为用户ZHANG创建一个模式TEST,并在其中定义一个表TAB1 */
    CREATE SCHEMA TEST AUTHORIZATION ZHANG
    CREATE TABLE TAB1(COL1 SMALLINT,
                      COL2 INT,
                      COL3 CHAR(20)
    );

删除模式,CASCADE(级联)和RESTRICT(限制)两者必选其一。选择CASCADE表示删除模式的同时把该模式中所有数据库对象全部删除;选择RESTRICT表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。

    DROP SCHEMA<模式名><CASCADE|RESTRICT>;
    /* 删除模式ZHANG,同时,该模式中已经定义的表TAB1也被删除了 */
    DROP SCHEMA ZHANG CASCADE;
  • 基本表的定义、删除与修改

定义基本表 CREATE TABLE

    CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
                       [,<列名><数据类型>[列级完整性约束条件]]
                       ...
                       [,表级完整性约束条件]);
    /* 建立一个“学生”表Student */
    CREATE TABLE Student
      (Sno CHAR(9) PRIMARY KEY, /* 列级完整性约束条件,Sno是主码 */
      Sname CHAR(20) UNIQUE,    /* Sname取唯一值 */
      Ssex CHAR(2),
      Sage SMALLINT,
      Sdept CHAR(20)
     );
    /* 建立一个“课程”表Course */
    CREATE TABLE Course
      (Cno CHAR(4) PRIMARY KEY, /* 列级完整性约束条件,Cno是主码 */
      Cname CHAR(40) NOT NULL,  /* 列级完整性约束条件,Cname不能取空值 */
      Cpno CHAR(4),             /* Cpno表示先修课 */
      Ccredit SMALLINT,
      FOREIGN KEY(Cpno) REFERENCE Course(Cno)
      /* 表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno */
      /* 本例用来说明参照表和被参照表可以是同一个表 */
     );    
     /* 建立学生选课表SC */
    CREATE TABLE SC
      (Sno CHAR(9),
      Cno CHAR(4),
      Grade SMALLINT,
      PRIMARY KEY(Sno,Cno),  /* 主码由两个属性构成,必须作为表级完整性进行定义 */
      FOREIGN KEY(Sno) REFERENCE Student(Sno),
            /* 表级完整性约束条件,Sno是外码,被参照表是Student */
      FOREIGN KEY(Cno) REFERENCE Course(Cno)
            /* 表级完整性约束条件,Cno是外码,被参照表是Course */
     );

数据类型:在SQL中域的概念用数据类型来实现。定义表的各个属性时需要指明其数据类型及长度。

模式与表:每一个基本表都属于某一个模式,一个模式包含多个基本表。定义基本表时有三种方法定义它所属的模式。

    /* 1.在表中明显地给出模式名 */
    CREATE TABLE "S-T".Student(...);/* Student所属的模式是S-T */
    /* 2.在创建模式语句中同时创建表 */
    /* 为用户ZHANG创建一个模式TEST,并在其中定义一个表TAB1 */
    CREATE SCHEMA TEST AUTHORIZATION ZHANG
    CREATE TABLE TAB1(COL1 SMALLINT,
                      COL2 INT,
                      COL3 CHAR(20)
    );
    /* 3.设置所属的模式,这样在创建表时表名中不必给出模式名,系统根据搜索路径确定模式 */
    SHOW search_path;                /* 显示当前搜索路径 */
    /* 搜索路径默认为$user,PUBLIC,表示首先搜索与用户名相同的模式名,如果不存在,则使用PUBLIC模式 */
    /* 数据库管理员可以设置搜索路径来建立S-T.Student基本表 */
    SET search_path TO "S-T",PUBLIC; /* 设置搜索路径 */
    CREATE TABLE Student(...);       /* 定义基本表 */
    

修改基本表 ALTER TABLE

    ALTER TABLE <表名>
    [ADD [COLUMN] <新列名><数据类型> [完整性约束]]
    [ADD<表级完整性约束>]
    [DROP [COLUMN]<列名> [CASCADE|RESTRICT]]
    [DROP CONSTRAINT<完整性约束名> [RESTRICT|CASCADE]]
    [ALTER COLUMN <列名><数据类型>];
    
    /* 向Student表增加“入学时间”列,其数据类型为日期型 */
    ALTER TABLE Student ADD S_entrance DATE; /* 新增加的列一律为空值 */
    /* 将年龄的数据类型改为整数 */
    ALTER TABLE Student ALTER COLUMN Sage INT;
    /* 增加课程名称必须取唯一值的约束条件 */
    ALTER TABLE Course ADD UNIQUE(Cname);
    

删除基本表 DROP TABLE

    DROP TABLE <表名> [RESTRICT|CASCADE];
    /* 删除Student表 */
    DROP TABLE Student CASCADE;

CASCADE(级联)和RESTRICT(限制),前者删除时,相关依赖对象如视图都将被一起删除,后者若存在依赖该表的对象则基本表不能被删除。

  • 索引的创建与删除

建立索引 CREATE INDEX

    CREATE [UNIQUE] [CLUSTER] INDEX<索引名>
    ON <表名>(<列名>[次序][,<列名>[<次序>]]...);
    
    /* Student表按学号升序建立唯一索引 */
    CREATE UNIQUE INDEX Stusno ON Student(Sno);  
    /* Course表按课程号升序建立唯一索引 */
    CREATE UNIQUE INDEX Coucno ON Course(Cno);
    /* SC表按学号升序、课程号降序建立唯一索引 */
    CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

次序可选 ASC-升序(默认) DESC-降序,UNIQUE表明此索引的每一个索引值只对应唯一的数据记录,CLUSTER表示要建立的索引是聚簇索引。

修改索引

    ALTER INDEX <旧索引名> RENAME TO <新索引名>;
    /* 将SC表的SCno索引名改为SCSno */
    ALTER INDEX SCno RENAME TO SCSno;

删除索引

    DROP INDEX <索引名>;
    /* 删除Student表的Stusname索引 */
    DROP INDEX Stusname;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容