SQL--数据定义
数据定义
关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有模式、表、视图和索引等。因此SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。
SQL的数据定义功能:
操作对象 | 操作方式 | ||
---|---|---|---|
创建 | 删除 | 修改 | |
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
模式的定义与删除
-
定义模式
在SQL中,模式定义语句如下:
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;
如果没有指定<模式名>,那么<模式名>隐含为<用户名>。
要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的CREATE SCHEMA的权限。
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引等。
用户可以在创建模式的同时在这个模式中进一步创建基本表、视图、定义授权。即:
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
例1:为用户ZHANG创建一个模式TEST,并且在其中定义一个表TABL1
CREATE SCHEAM TEST AUTHORIZATION ZHANG CREATE TABLE TAB1(COL1 SMALLINT, COL2 INT, COL3 CHAR(20), COL4 NUMERIC(10,3), COL5 DECIMAL(5,2) );
-
删除模式
模式删除语句:
DROP SCHEMA<模式名><CASCADE|RESTRICT>;
其中CASCADE和RESTRICT两者必选其一。
CASCADE(级联):删除该模式中所有的数据库对象。
RESTRICT(限制):如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。
基本表的定义、删除与修改
-
定义基本表
创建了一个模式就建立了一个数据库的命名空间,一个框架。在这个空间中首先要定义的是该模式包含的数据库基本表。
SQL语句定义基本表:
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,<表级完整性约束条件>]);
例2:建立一个学生表Student
CREATE TABLE Student( Sno CHAR(9)PRIMARY KEY,/*列级完整性约束条件,Sno是主码*/ Sname CHAR(20)UNIQUE,/*Sname取值唯一*/ Ssex CHAR(2), Sage SMALLINT, Sdept CHSR(20) );
-
数据类型
数据类型 含义 CHAR(n),CHARACTER(n) 长度为n的定长字符串 VARCHAR(N),CHARACTERVARYING(n) 最大长度为n的变长字符串 CLOB 字符串大对象 BLOB 二进制大对象 INT,INTEGER 长整数(4字节) SMALLINT 短整数(2字节) BIGINT 大整数(8字节) NUMERIC(p,d) 定点数,由p位数字组成,小数点后面有d位数字 DECIMAL(p,d),DEC(p,d) 同NUMERIC REAL 取决于机器精度的单精度浮点数 DOUBLE PRECISION 取决于机器精度的双精度浮点数 FLOAT(n) 可选精度的浮点数,精度至少为n位数字 BOOLEAN 罗基布尔量 DATE 日期,包含年、月、日,格式为YYYY:MM:DD TIME 时间,包含一日的时、分、秒,格式为HH:MM:SS TIMESTAMP 时间戳类型 INTERVAL 时间间隔类型 -
模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表。当定义基本表时一般可以有三种方法定义他所属的模式。
-
在表中明显的给出模式名。
CREATE TABLE "模式名".表名(...);
-
在创建模式语句中同时创建表,如例1所示。
-
设置所属模式,这样在创建表时表名中不必给出模式名。
当用户创建基本表时,若没有指定模式,系统根据搜索路径(search path)来确定该对象所属的模式。
搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。若搜索路径中的模式名都不存在,系统将给出错误。
显示当前搜索路径:
SHOW search_path;
设置搜索路径:
SET search_path "S_T",PUBLIC;
然后定义基本表:
CREATE TABLE Student(...);
实际上是建立了S_T . Student基本表。
-
-
修改基本表
SQL语言用ALTER TABLE语句修改基本表:
ALTER TABLE <表名> [ADD[COLUMN]<新列名><数据类型>[完整性约束]] /*增加新列、列的完整性约束条件*/ [ADD<表级完整性约束>] /*增加新的表级完整性约束条件*/ [DROP[COLUMN]<列名>[CASCADE|RESTRICT]] /*删除表中的列,如果指定了CASCADE短语,则自动删除引用了引用了该列的其他对象,比如视图;如果指定了RESTRICT短语,则如果该列被其他对象引用,将拒绝删除该列*/ [DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]--删除指定的完整性约束条件 [ALTER COLUMN<列名><数据类型>];--修改原有的列定义
例3:向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrsncr DATE;
例4:将年龄的数据类型由字符型改为整数
ALTER TABLE Student DROP COLUMN Sage INT;
例5:增加课程名称必须取唯一值的约束条件
ALTER TABLE course ADD UNIQUE(Cname);
-
删除基本表
SQL语言用DROP TABLE语句修改基本表:
DROP TABLE<表明>[RESTRICT|CASCADE];
若选择RESTRICT,则该表的删除是有条件限制的。欲删除的基本表不能被其他表的约束所引用(如:CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器,不能有存储过程或函数等,如果存在这些依赖该表的对象,则此表不能被删除。
若选择CASCADE,则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,都将被一起删除。
默认情况是RESTRICT
索引的建立与删除
索引是关系数据库管理系统的内部实现技术,属于内模式的范畴。
关系数据库管理系统在执行查询时会自动选择合适的索引作为存取路径,用户不必也不能显式的选择索引
-
建立索引
SQL语言用CREATE INDEX语句修改基本表:
CREATE [UNIQUE][CLUSTER]INDEX<索引名> ON <表名>(<列名>[<次序>][,<列名>][<次序>]]...); --<次序>可选ASC(升序)或DESC(降序),默认值为ASC --UNIQUE表示此索引的每一个索引值只对应唯一的数据记录 --CLUSTER表示要建立的索引是聚簇索引。
例6:为学生—课程数据库中的Student、Course和SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建立唯一索引,SC表按学号升序和课程号降序建立唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Courseno ON Course(Cno); CREATE UNIQUE INDEX SCno ON Student(Sno ASC,Cno DESC);
-
修改索引
对于已经建立的索引,重命名索引格式为:
ALTER INDEX <旧索引名>RENAME TO<新索引名>;
-
删除索引
SQL语言用DROP INDEX语句删除索引:
DROP INDEX<索引名>;