数据库系统原理:第三章关系数据库语言(一)

数据库系统原理

数据库系统原理第三章的部分内容,主要包括SQL概述和数据定义。

SQL概述

SQL的特点

  1. 综合统一
    集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)于一体
    DDL:Create(创建)、Alter(修改)、Drop(删除)
    DML:Insert、 Delete、Update、Select
    DCL:Grant、 Revoke
  2. 高度非过程化
  3. 面向集合的操作方式
  4. 以同一种语法结构提供多种使用方式
    • SQL是一种独立的语言
    • SQL又是一种嵌入式语言,可以嵌入到C++、Java等高级语言中使用
  5. 语言简洁,易学易用
    SQL功能 动词
    数据查询 SELECT
    数据定义 CREATE、DROP、ALTER
    数据操纵 INSERT、UPDATE、DELETE
    数据控制 GRANT

SQL的基本概念

SQL支持关系数据库的三级模式结构

基本表
本身独立存在的表。存储在数据库中,所以基本表是实表。

视图
从一个或几个基本表导出的表。不独立存储在数据库中,数据库中只存储视图的定义,不存储视图的数据,视图的数据来源于基本表,所以视图是虚表。

用户可以在视图上再定义新的视图。

存储文件、索引
表中数据和相应存储位置的列表。建立索引可以加快查询速度。索引存放在存储文件中,属于内模式的范畴。

数据定义

数据定义语句

操作对象 操作方式
创建 删除 修改
模式 CREATE SCHEMA DROP SCHEMA 模式无法修改
CREATE TABLE DROP TABLE ALTER TABLE
视图 CREATE VIEW DROP VIEW 视图无法修改
索引 CREATE INDEX DROP INDEX ALTER INDEX

模式

下文出现的尖括号和方括号均可忽略

模式定义

  • 定义模式实际上定义了一个命名空间(或者说目录)
  • 在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。
  • CREATE SCHEMA 中可以接受 CREATE TABLE,CREATE VIEWGRANT子句
  • 格式如下
    CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [ <表定义子句> | <视图定义子句> | <授权定义子句> ]

示例:
【例1】为用户WANG定义一个学生-课程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG;

【例2】若没有指定模式名,则默认为用户名
CREATE SCHEMA AUTHORIZATION WANG;

删除模式

格式:
DROP SCHEMA <模式名> <CASCADE|RESTRICT>

  • CASCADE(级联)
    • 删除模式的同时把该模式中所有数据库对象全部删除
  • RESTRICT(限制)
    • 如果该模式中定义了下属的数据库对象,即不为空,则无法删除

基本表

定义基本表

格式:
CREATE TABLE <表名>
( <列名> <数据类型> [ <列级完整性约束条件> ],
<列名> <数据类型> [ <列级完整性约束条件> ],
…,
<表级完整性约束条件>);

  • 表名:所要定义的基本表的名字
  • 列名:组成该表的各个属性(列)
  • 列级完整性约束条件:涉及相应属性列的完整性约束条件
  • 表级完整性约束条件:涉及一个或多个属性列的完整性约束条件

常用的完整性约束:

  • NULL/not null: 表示属性列不能为空
  • primary key(A): 表示属性列A构成关系的主码
  • foreign key(A) reference r: 表示属性列A构成关系的外码,且被参照关系为r
  • check(P): 表示关系中的每个元组必须满足谓词P
  • unique(A): 表示每个元组在属性列A上是唯一的,即没有重复值

【例3】建立“学生”表STUDENT,学号是主码,姓名取值唯一

CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,     /*列级完整性约束条件,Sno是主码*/
Sname CHAR(20) UNIQUE,        /*列级完整性约束条件,Sname是唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
);

【例4】建立一个“课程”表Course

CREATE TABLE Course
(Sno CHAR(4) PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4),     /*先修课*/
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)     
/*Cpno是外码,被参照表是Course,被参照列是Cno*/
);

【例5】建立一个学生选课表SC

CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno, Cno),
/*主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY(Sno) REFERENCES Student(Sno),
/*表级完整性约束条件,Sno是外码,被参照表是Student*/
FOREIGN KEY(Cno) REFERENCES Course(Cno)
/*表级完整性约束条件,Cno是外码,被参照表是Course*/
);

修改基本表

ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ]]
[ ADD <表级完整性约束> ]
[ DROP <列名> [ CASCADE|RESTRICT ]]
[ DROP <完整性约束条件> ]
[ ALTER <列名> <数据类型>];

  • 表名:要修改的基本表
  • ADD子句:增加新列和新的完整性约束条件
  • DROP子句:删除指定列和完整性约束条件
  • ALTER子句:修改数据类型等

【例6】向Student表增加“入学时间”列,其数据类型为日期型

ALTER TABLE Student ADD S_entrance DATE
不管基本表中原来是否已有数据,新增加的列一律为空值。

【例7】将年龄的数据类型(设原类型是字符型)改为整数型

ALTER TABLE Student ALter COLUMN Sage INT

【例8】增加课程名称必须取唯一值的约束条件

ALTER TABLE Course ADD UNIQUE(Cname)

删除基本表

格式:
DROP TABLE <表名> [RESTRICT | CASCADE];

  • RESTRICT:删除表是有限制的,如果存在依赖该表的对象,则此表不能被删除
  • CASCADE:删除该表没有限制,在删除基本表的同时,相关的依赖对象一起删除

索引

索引的定义

索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。是某个表中一列或一些列的值和指向这些数据的指针列表组成的清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

建立索引

格式:
CREATE [UNIQUE | CLUSTERED | NONCLUSTERED] INDEX <索引名> ON <表名> ( <列名> 次序 ,<列名> 次序 … )

  • 表名:要建立索引的基本表的名字
    • 索引可以建立在该表的一列或多列上,各列名之间用逗号隔开
  • 次序:指定索引值的排列次序,升序:ASC,降序:DESC,缺省值为ASC
  • UNIQUE:此索引的每一个索引值只对应唯一的数据记录[1]
  • CLUSTERED:表示要建立的索引是 聚簇索引
  • NONCLUSTERED:表示要建立的索引是非聚簇索引
  • 聚簇索引要求数据库文件的物理顺序和索引排列顺序一致,而非聚簇索引则不做要求,数据库文件的物理顺序和索引排列顺序可以不同

【例9】为学生-课程数据库中的Student,Course,SC三个表建立索引,Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。

CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC);

修改索引

格式:
ALTER INDEX <旧索引名> RENAME TO <新索引名>;

【例10】将SC表的SCno索引名改为SCSno
ALTER INDEX SCno RENAME TO SCSno;

删除索引

格式:
DROP INDEX <索引名>;
在删除索引时,系统会从数据字典中删去有关该索引的描述。

【例11】删除Student表的Studsname索引
DROP INDEX Stusname;


  1. 唯一索引是不允许其中任何两行具有相同索引值的索引。 ↩︎