SQL的DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括
- 每个关系的模式
- 每个属性的取值类型
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系再磁盘上的物理存储结构
基本类型
SQL标准支持多种固有类型,包括:
- char(n):固定长度的字符串,用户指定长度n。也可以使用全称character
- varchar(n):可变长度的字符串,用户指定最大长度n,等价于全称character varying
- int:整数类型(和机器相关的整数型的有限子集),等价于全称integer
- smallint:小整数类型(和机器相关的整数类型的子集)
- numeric(p,d):定点数,精度由用户指定。这个数有p位数字(加上一个符号位),其中d位数字在小数点右边。所以在一个这种类型的字段上,numeric(3,1)可以精确存储44.5,但是不能精确存储444.5或0.32这样的数
- real,double precision:浮点数与双精度浮点数,精度与机器相关
- float(n):精度至少为n位的浮点数
每种类型都可能包含一个被称作空值的特殊值。空值表示一个缺失的值,该值可能存在但并不为人所知,或者可能根本不存在。在可能的情况下,我们希望禁止加入空值
char数据类型存放固定长度的字符串。例如,属性A的类型是char(10)。如果我们为此属性存入字符串“Avi”,那么该字符串后会追加7个空格来使其达到10个字符的串长度
如果数据类型是varchar(10),我们在属性B中存入字符串“Avi”,则不会增加空格。
当比较两个char类型的值时,如果它们的长度不同,在比较之前会自动在短值后面加上额外的空格以使它们的长度一致
基本模式定义
用create table命令定义SQL关系
下面的命令在数据库中创建了一个department关系
create table department
( dept_name varchar(20),
building varchar(15),
budget numeric(12,2),
primary key(dept_name));
上面这个关系是有三个属性的
dept_name是最大长度为20的字符串
building是最大长度为15的字符串
budget是一个12位的数,其中2位数字在小数点后面
create table命令还指明了dept_name属性是department关系的主码。
用分号表示结束
完整性约束
SQL支持许多不同的完整性约束,例如
primary key()
primary key 声明表示属性构成关系的主码
主码属性必须为非空且唯一,也就是说没有一个元组在主码属性上取空值,关系中也没有两个元组在所有主码属性上取值相同。虽然主码的声明是可选的,但为每个关系指定一个主码通常会更好
foreign key ( )references
foreign key声明表示关系中任意元组在属性( )上的取值必须对应于关系s中某元组在主码属性上的取值
这里再次解释一下关于 外键(foreign key): 一个表中的外键指向另一个表中的主键,主键所在的表就是主表(父表),外键所在的表就是从表(子表)
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
比如这个表
"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列。
"Persons" 表中的 "P_Id" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "P_Id" 列是 "Orders" 表中的 FOREIGN KEY。
not null
一个属性上的not null约束表明在该属性上不允许空值。
换句话说,此约束把空值排除在该属性域之外
例如:
create table instructor(
ID varchar(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2),
primary key(ID),
foreign key(dept_name)references department
);
instructor关系的name属性上的not null约束保证了教师的姓名不会为空
SQL禁止破坏完整性约束的任何数据库更新。
例如,如果关系中一条新插入或新修改的元组在任意一个主码属性上有空值,或者元组在主码属性上的取值与关系中的另一个元组相同,SQL将标记一个错误,并阻止更新
insert插入
一个新创建的关系最初是空的,我们可以用insert命令将数据加载到关系中。
例如,我们如果希望插入:在Biology系中有一个名为 Smith的教师,其instructor_id为10211,工资为66000美元。可以这样写
insert into instructor
values(10211,'Smith','Biology',66000);
值被给出的顺序应该遵循对应属性在关系模式中列出的顺序。
delete删除元组
我们可以使用delete命令从关系中删除元组
delete from student;
将从student关系中删除所有元组,其他格式的删除命令允许指定待删除的元组
drop table删除关系
如果要从SQL数据库中去掉一个关系,我们使用drop table命令。drop table命令从数据库中删除关于被去掉关系的所有信息
命令:
drop table r;
这个语句比
drop from r;
更强。
drop from 保留关系r,但删除r中的所有元组。
drop table删除r的所有元组,还删除r的所有模式
alter table增加属性
alter table为已有关系增加属性。关系中的所有元组在新属性上的取值将被设为null
格式为:
alter table r add A D;
其中r上现有关系的名字,A上待添加属性的名字,D是待添加属性的域。
我们可以通过
alter table r drop A;
从关系中去掉属性。其中r是现有关系的名字,A是关系的一个属性名字