SQL命令包括数据定义、查询、操纵和控制四大类,其中SQL的数据定义用于创建数据库中的全部数据对象,包括SQL数据库、模式、基本表、视图和索引等。
一、基本表的定义
当创建完数据库和模式之后,相当于是建立了一个命名空间,在这个空间中,首先要定义基本表。定义基本表,使用SQL命令中的CREATE TABLE命令来完成。
创建基本表的语法:
CREATE TABLE <基本表名>
(<列名 ><数据类型>[列级完整性约束条件]
[, <列名 ><数据类型>[列级完整性约束条件]
[.表级完整性约束条件]);
建立一张表,首先给出表的名字,依次给出该表中的若干列的名字;对于每一个列它的数据类型,如果有完整性约束条件的话,在每一个列名之后要给出列级完整性约束条件;如果完整性约束条件涉及到多个列的话,要在最后给出表级的完整性约束条件。
在SQL中,域的概念是用数据类型来实现的。
SQL提供的基本数据类型有数值型、字符型和日期型等等。
1.数值型:
长整型 Integer(int):长整数(4个字节)。
短整型 smallint:短整数(2个字节)。
numeric(p,d):定点数,共p位(不包括小数点),右边d位。
real:浮点数(4个字节)。
double precision:双精度浮点数。
float(n):浮点数(8个字节)。
如果定义的一列是短整型的话,意味着是如果是两个字节的短整数、带符号的数据,那么该列的取值范围就应该是整数,并且由负的2的15次方到正的2的15次方-1这样的一个范围。也就是数据类型是给出的某一列数据的取值范围,以允许的形式。
2.字符型:
char(n):固定长度的字符串。
varchar(n):可变长字符串。
3.日期/时间型:
date:日期(年、月、日)。
time:时间(小时、分、秒)。
SQL2003中支持一些新的数据类型:
4.XML数据类型(SQLXML)
5.其他数据类型
布尔类型(BOOLEAN)。
时间戳类型timestamp。
6.用户定义数据类型:
SQL2003中允许用户去自定义数据类型。
每一种类型都会有很多种变化,而不同的DBMS所支持的数据类型也不完全相同。
属性选用哪一种数据类型,根据其取值和所做的运算来确定。如学生的学号可以用数值型、也可以用字符型来表示,由于学号一般不做加减乘除类的运算,所以通常用字符型来表示学号。
建表的同时,还可以定义与该表有关的完整性约束条件。所谓的完整性约束条件,指的是数据所要满足的语义上的一些限制条件。
在SQL中常用完整性约束:
主码约束:PRIMARY KEY
唯一性约束:UNIQUE
非空值约束:NULL/NOT NULL
参照完整性约束:FOREIGN KEY
REFERENCES
检查子句:CHECK
上述的这些保留字不能用作表名、列名等。
如果完整性约束条件涉及到该表的多个属性列时,必须在表级定义该约束条件,否则既可以把该约束条件定义在列级,也可以定义在表级。
完整性约束条件被存入系统的数据字典中。
例一:建立学生关系模式S(sno,sname,age,sex)
学生关系模式S有四个属性列,分别表示学生学号-sno,姓名-sname,年龄-age,性别-sex。那么在SQL中,每个关系模式取一张表来对应。
建立表S,给出每一个列的数据类型及它的约束。学号是字符型,4位,不能为空;姓名是字符型,8位,不能为空;年龄是短整型;性别是固定长度的字符型,1位。其中,在表S中,学号是主键,可以定义在表级,也可以定义在列级。
在SQL Server2008的环境中,当把建表S的命令输入进去、的执行成功以后,在student数据库之下看到表点右键刷新后,可以看到表S已经被创建成功,dbo是SQL Server中默认的用户名和模式名。
例二:建立课程关系模式 C(cno,cname,tname)
课程关系模式 C有三个属性列,包括课程号-cno、课程名-cname、教室名tname。用CREATE TABLE C来完成建表。
同上,在建表C的时候指明了这三个列的名字、每一个列的数据类型、长度和完整性约束条件。同理,在表C中,课程号是主键,可以定义在表级,也可以定义在列级。
例三:建立选课关系模式SC(sno,cno,grade)
选课关系模式 SC有三个属性列,包括学号-sno、课程号-cno、成绩-grade。仍然用CREATE TABLE SC来完成建表。
在SC中,学号是字符型,4位,不能为空;课程号是字符型,4位,不能为空;成绩是短整型。在SC表中,除了定义主键以外,还要定义外键;主键是由两个属性列共同组成的,所以必须要定义在表级,而不能定义在上面的列级;外键可以定义在表级,也可以定义在列级,这里定义在表级,指出学号是一个外键、引用的是表S中的学号的取值,课程号也是一个外键、引用的是表C中的课程号的取值。此外,在表SC中,还增加了一个CHECK约束,即成绩可以为空、如果成绩不为空的话就必须在取值范围0到100之间取值。
二、基本表的修改
DBMS允许用户修改已经建好的基本表。
(1)对表增加列
修改基本表的命令主要是用ALTER TABLE来表示。
ALTER TABLE<表名> ADD <列名> <数据类型>
[NULL|NOT NULL],...;
例:ALTER TABLE S ADD addr CHAR(20);(向表S中增加地址列addr、字符型的、长度为20)
如果原表中已存在数据,则新定义的列必须设置为NULL,表中原有元组在新增加的列上的值均被定义为空值
(2)撤销原有的列
语法:ALTER TABLE<表名> DROP COLUMN<列名>;
例: ALTER TABLE S DROP COLUMN addr:
(3)修改原有的列类型
语法:ALTERTABLE<表名> ALTER COLUMN<列名>;
例:ALTER TABLES ATER addr CHAR(10);
需要注意的是,不同的DBMS对于标准的支持不同。
三、基本表的删除
当基本表不再被需要的时候,DBMS也允许用户删除基本表。
语法:DROPTABLE<表名>[CASCADE|RESTRICT]
★CASCADE(连锁)RESTRICT(约束)
需要注意的是,删除表的命令有两个可选项,CASCADE表示级联操作,RESTRICT表示有约束的删除。
例:DROP TABLE SC CASCADE:
当选择CASCADE级联模式删除表时,表的数据、表上建立的索引和视图都自动被删除。如果选择RESTRICT约束模式,如果在表SC上存在其他的数据对象即建立在表SC上的视图或者是索引的话,那么是不允许删除表SC的。
需要注意的是,不同的数据库产品对于标准的语法会有所差别。如在SQL Server中,没有CASCADE(连锁)、RESTRICT(约束)这两个选项,允许用户直接删除。因此,在执行删除基本表的操作的时候要格外的小心。
四、总结
SOL的数据定义部分包括对模式、基本表、索引等数据库对象的创建和删除操作。
其中,基本表是最主要的数据库对象,视图和索引等是建立在基本表之上的。每一个表与关系模式对应,建立一个用户数据库首先就是建立该数据库中的所有的表。
在实现SOL标准的时候,不同的数据库产品在处理策略上会与标准有所差别,具体需参考所用产品的用户手册。