21/7/25 读书笔记 SQL数据定义

21/7/25 读书笔记

数据库系统概论 SQL基本概念

结构化查询语言(Structured Query Language,SQL)是关系数据库的标准语言。SQL是关系数据库的语言标准,但是所有的关系数据库厂商都没能支持SQL标准的所有概念与特性,同时这些厂商还会在标准上添加各自的拓展。

SQL的最大特点在于其集数据定义、数据操纵、数据控制功能于一体,采用了统一的语言风格来完整数据库生命周期中的所有活动,其其他特点包括:

  • 高度非过程化:这是在关系数据库的基础上提供的,使得存取路径对用户透明。
  • 面向集合(关系)的操作方式:操作对象和操作结果都是集合(即关系)。
  • 统一的语法结构:在独立语言和嵌入式语言中表现出相同的语法结构。

SQL语言描述下,数据库的三级模式呈现下列形式:

  1. 外模式:视图(view)和部分基本表
    • 视图:从一个或多个基本表导出,其不存在独立的数据存储实体,仅在存储文件中存放视图的定义。对于用户来说视图基本等同于基本表,可以在视图上再定义视图。
  2. 模式:基本表
  3. 内模式:存储文件

数据库系统概论 SQL数据定义

首先介绍数据库系统中普遍存在的一个数据结构——数据字典:数据字典是关系数据库系统下定义的一组系统表(本质还是关系),其记录了数据库所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、操作权限信息以及统计信息等。SQL进行数据定义时,同时也更新了数据库系统的数据字典。在优化与处理时数据字典是极为重要的抓手。

我们定义一个场景,其由三个关系构成:

  • Student(Sno,Sname,Ssex,Sage,Sdept)
  • Course(Cno,Cname,Cpno,Credit)
  • SC(Sno,Cno,Grade)

接下来我们基于这个场景来进行数据定义

模式的定义与删除

在大多数数据库的SQL语法中,模式(SCHEMA)可以看做是数据库(DATABASE)。SQL中的模式正对应于数据库模型中三级模式中的(数据库)模式,用于存放基本表,同时也可以在模式下定义视图、索引等数据库对象。

创建一个模式:

CREATE SCHEMA "student-course" AUTHORIZATION Nortonary;

其中我们指定了模式名为“student-course”。缺省状态下将命名为用户同名。

同时模式创建语句也接收创建表(TABLE)和视图(VIEW)、授予权限(GRANT)的子句:

CREATE SCHEMA "student-course" AUTHORIZATION Nortonary
CREATE TABLE tab1(col1 SMALLINT,
				 col2 INT
				 );

删除一个模式时需要指定删除级别,包括:

  • CASCADE:删除后将把该模式下定义的所有数据库对象一起删除
  • RESTRICT:如果该模式下定义了数据库对象,那么该删除语句报错

基本表的定义与删除

建立表的同事需要指明各列的数据类型数据的完整性约束条件

CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, # 列级完整性约束条件,直接在列定义中表明
Sname CHAR(20) UNIQUE, # 同上
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);

CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY, # 列级完整性约束
 Cname CHAR(40) NOT NULL,
 Cpno CHAR(4),
 Ccredit SMALLINT,
 FOREIGN KEY (Cpno) REFERENCES Course(Cno) # 表级完整性约束,独立于列定义。注意这里是一个自连接。
);

CREATE TABLE SC
(Sno CHAR(9),
 Cno CHAR(4),
 Grade SMALLINT,
 PRIMARY KEY(Sno,Cno), # 当主码由两个属性构成,需要作为表级完整性约束
 FOREIGN KEY (Sno) REFERENCES Student(Sno), # 外连接到Student表
 FOREIGN KEY (Cno) REFERENCES Course(Cno) # 外连接到Course表
);

域的概念在SQL中表现为数据类型,每个列对应一种属性,每种属性只能有一种数据类型,多个属性可以共享同一个数据类型。SQL标准提供了多种数据类型,在此不赘述。注意为属性选用数据类型应该以实际情况决定。

由于表是在模式下建立的,因此我们在创建表时需要指定模式名称,有以下几种方式:

  • 缺省(如上情况):自动安装全局变量search_path来寻找模式,取该变量中定义的第一个有效模式作为目标
    • 可采用 SHOW search_pathSET search_path TO "模式名1", PUBLIC 两个语句来查看与修改该全局变量。
  • 创建模式时同时在子句中创建表
  • 创建表时将表名表示为"模式名".表名的形式

修改基本表

SQL标准下利用ALTER可以修改基本表的内容与定义,包括添加与删除列,列级完整性约束、表级完整性约束,改变数据类型。

ALTER TABLE Student ADD Sentrance DATE; # 向Student新增列
ALTER TABLE Student ALTER COLUMN Sage INT; # 为Student[Sage]修改数据类型
ALTER TABLE Course ADD UNIQUE(Cname); # 为Course[Cname]增加UNIQUE这一列级完整性约束

索引的建立与删除

首先必须说明,SQL标准没有给出索引的概念。索引是大多数厂商为了让客户根据自身情况加快查询效率所提出的概念,允许用户为基本表建立一个或多个索引。索引建立后由系统使用与维护,不需要用户干预即可提高查询效率。索引属于内模式的范畴!,其与基本表的存储形式密不可分。

建立索引的同时需要指定其名称,以使得同一张基本表中的多个索引可区分:

CREATE UNIQUE INDEX index1 ON Student(Sno); # UNIQUE 约束索引值与记录一一对应
CREATE INDEX index2 ON SC(Sno ASC,Cno DESC); # ASC表示升序,DESC表示降序,该语句通过两个属性共同建立索引并指定了索引排列顺序
DROP INDEX index1;

注意,索引名是全局的,而与基本表相解绑,因此所有的索引名都应该不同

posted @ 2021-07-25 09:17  neumy  阅读(240)  评论(0)    收藏  举报