目录
SQL的数据定义语言
关系和其他数据库对象是存在于环境中的
每个环境由一个或多个目录catalog组成,每个目录包含一个模式schema集合
模式是数据库对象的命名集合,模式中的对象可以是表、视图、域、索引,模式中的所有对象有相同的所有者
(看不懂
具体语法:
库
创建数据库
CREATE SCHEMA database-name AUTHORIZATION user-identifier;
创建一个名为database-name
的数据库模式,并将其授权给指定的user-identifier
用户。
eg:CREATE SCHEMA library_db AUTHORIZATION guoqing;
-
CREATE DATABASE:
CREATE DATABASE
用于创建一个新的数据库。- 数据库是一个包含多个表、视图、存储过程等数据库对象的容器。
- 通常情况下,一个数据库会包含相关联的表和数据,以满足特定应用程序或业务需求。
-
CREATE SCHEMA:
CREATE SCHEMA
用于创建一个新的数据库模式。- 模式是数据库对象的逻辑集合,例如表、视图、存储过程等,它们彼此之间可能具有一定的关联。
- 模式通常用于组织和管理数据库对象,可以将具有类似功能或用途的对象放置在同一个模式下。
- 一个数据库可以包含多个模式,每个模式可以有不同的所有者和权限设置。
主要区别在于:
CREATE DATABASE
创建整个数据库,包含了所有的数据库对象。CREATE SCHEMA
创建数据库内的逻辑组织单元,用于组织和管理数据库对象。
删除数据库
DROP SCHEMA database-name [RESTRICT | CASCADE];
RESTRICT - 如果模式内没有对象,则删除该模式
CASCADE - 删除模式中所有对象的内容和定义
根据具体需求选择
eg:DROP SCHEMA library RESTRICT;
域
表
创建表
CREATE TABLE TableName
(
{columnName dataType [NOT NULL][UNIQUE][DEFAULT defaultOption[CHECK(searchConditin)]}[,...]
[PRIMARY KEY(listOfColumns)],
{[UNIQUE(listOfColumns)][,...]}
{[FOREIGN KEY(listOfFKColumns)REFERENCES ParentTableName[(listOfCKColumns)],[ON UPDATE referentialAction][ON DELETE referentialAction]][,...]}
{[CHECK(searchCondition)][,...]}
);
创建名为TableName的表
{columnName dataType [NOT NULL][UNIQUE][DEFAULT defaultOption][CHECK(searchConditin)]}[,...]
: 这部分定义了表的列。每个列由列名(columnName
)和数据类型(dataType
)组成。选择性地为每列指定约束,比如NOT NULL
表示该列不允许为空,UNIQUE
表示该列中的值必须唯一,DEFAULT defaultOption
表示当未指定值时,该列将采用默认值,CHECK(searchConditin)
表示该列的值必须满足指定的条件。
然后是主键、唯一约束、外键以及表级别的检查约束:
[PRIMARY KEY(listOfColumns)]
: 这部分定义了表的主键。listOfColumns
是一个列名列表,指定了作为主键的列。主键列必须定义为NOT NULL{[UNIQUE(listOfColumns)][,...]}
: 这部分定义了表的唯一约束,确保列中的值在表中是唯一的。可以指定多个唯一约束。{[FOREIGN KEY(listOfFKColumns) REFERENCES ParentTableName[(listOfCKColumns)] [ON UPDATE referentialAction] [ON DELETE referentialAction]][,...]}
: 这部分定义了外键关系。它将当前表的列作为外键与另一个表的主键列关联起来。你可以指定外键的更新和删除动作,比如ON UPDATE
和ON DELETE
。{[CHECK(searchCondition)][,...]}
: 这部分定义了表级别的检查约束,用于确保表中的数据满足指定的条件。
eg:定义选课表SC:
CREATE TABLE SC
(
S# CHAR(8) NOT NULL,
C# CHAR(8) NOT NULL,
G SMALLINT,
PRIMARY KEY(S#,C#),
FOREIGN KEY (S#) REFERENCES S(S#),
FOREIGN KEY (C#) REFERENCES C(C#)
);
删除表
DROP TABLE TableName [RESTRICT|CASCADE];
RESTRICT
: 在删除表之前,会检查是否有其他对象依赖于该表,如果有依赖关系存在,则会阻止删除操作,保持数据库的完整性。CASCADE
: 会自动删除与该表相关联的所有依赖对象,然后再删除该表。
修改表
ALTER TABLE TableName
[ADD NewColumnName dataType {NULL}]
[DROP 完整性约束条件]
[MODIFY columnName dataType];
ADD 向表中添加新列,和新的完整性约束条件
DROP 删除指定的完整性约束条件
MODIFY 修改指定列的数据类型
索引
创建索引
CREATE [UNIQUE] [CLUSTER] INDEX 〈索引名〉
ON <表名>(<列名> [<次序>][,<列名>[<次序>]] …);
CREATE INDEX
: 这部分是SQL语句的开始部分,指示要创建一个索引。[UNIQUE]
: 这是一个可选项,用于指定索引是否是唯一的。如果指定了UNIQUE
,则表明每个索引值只对应唯一的数据记录。
唯一索引只能建立在键(主键、候选键)上?
Sql新标准不主张使用索引,系统自动在主键上建立索引
唯一索引可以有多个,但索引列的值必须唯一,索引列的值允许有空值
[CLUSTER]
: 这也是一个可选项,用于指定索引是否是集群/聚簇索引。即索引项的顺序与表中记录的物理顺序一致;一个基本表最多只能建立一个聚簇索引。〈索引名〉
: 这是要创建的索引的名称。需要将〈索引名〉
替换为你想要创建的实际索引名。ON <表名>
: 这部分指定了要在哪个表上创建索引。需要将<表名>
替换为你想要创建索引的实际表名。(<列名> [<次序>][,<列名>[<次序>]] …)
: 这是指定索引包含哪些列的部分。你需要列出要在索引中包含的列名,并可以选择指定每列的排序顺序。
eg:在学生表S中按S#升序建 唯一索引
CREATE UNIQUE INDEX S_S# ON S(S#);
在SC中按S#升序和C#降序建唯一索引
CREATE UNIQUE INDEX SC_S#C#
ON SC(S# ASC,C# DESC);
删除索引
DROP INDEX <索引名>;