1. SQL的发展
2. SQL的优点
3. SQL的基本概念
1. 模式的定义与删除
2. 基本表的定义、删除和修改
3. 索引的建立和删除
结构化查询语言(Structured Query Language,SQL)集数据查询、数据操纵、数据定义和数据控制功能于一体,它的标准自公布以来随数据库技术的发展而不断丰富完善。
自SQL成为国际标准语言后,各个数据库厂家纷纷推出各自的SQL软件或与SQL的接口软件。这就使大多数数据库均用SQL作为共同的数据存取语言和标准接口,使不同数据库系统之间的操作有了共同的基础。
SQL之所以能够为用户和业界所接受并成为国际标准,是因为它是一个综合的、功能极强同时又简洁易学的语言。
但尽管SQL的标准在不断发展,目前还没有一个数据库系统能够支持SQL标准的所有概念和特性。大部分数据库系统能支持SQL/92标准中的大部分功能以及SQL99、SQL2003中的部分新概念。同时,许多软件厂商对SQL基本命令集还进行了不同程度的扩充和修改,又可以支持标准以外的一些功能特性。
接下来我们将会了解SQL的基本概念和功能。
(1)综合统一:非关系数据语言分多钟语言以完成不同的操作,而且需要修改模式时,必须停止数据库的运行,修改后要重装数据库,十分麻烦。相比之下,SQL集数据查询、数据操纵、数据定义和数据控制功能于一体,语言风格统一,可以独立完成数据库生命周期的全部活动,这就为数据库应用系统的开发提供了良好的环境。特别是用户在数据库系统投入运行后,还可以根据需要随时地、逐步地修改模式,而不影响数据库的运行,使得数据库系统具有良好的可扩展性。
(2)高度非过程化:非关系数据模型需要指明存取路径,而用SQL进行数据操作时,只要提出“做什么”,而无须指明“怎么做”,数据的存取由系统自动完成。这不但大大减少了用户负担,而且有利于提高数据独立性。
(3)面向集合:非关系数据模型的操作对象是一条记录,而SQL的操作对象是元组的集合,哪个比较高效一目了然。
(4)SQL既可以作为独立语言,又可以作为嵌入式语言:作为独立语言,用户可以在终端键盘上直接键入SQL命令来对数据库进行操作;作为嵌入式语言,它可以嵌入到高级语言(例如C、C++、Java等)程序中,供程序猿使用。关键是,两种使用方式下SQL的语法结构基本一致,因此提供了极大的灵活性和方便性。
(5)简洁易学!:学习语言最怕就是要背的东西多,而SQL语言十分简洁,完成核心功能只用了9个动词,而且接近英语口语,相当易学。数据查询(SELECT)、数据定义(CREAT,DROP,ALTER)、数据操纵(INSERT,UPDATE,DELETE)和数据控制(GRANT,REVOKE)。
SQL支持关系数据库系统的三级模式结构,其中外模式包括若干视图(view)和部分基本表(base table),模式包括若干基本表,内模式包括若干存储文件(stored file)。
用户可以用SQL对基本表和视图进行查询或其他操作,基本表和视图都是关系(二维表)。
基本表是独立存在的,在关系数据库管理系统中,一个关系对应一个基本表,一个或多个基本表对应一个存储文件。一个表可以带若干索引,索引也存放在存储文件中。
存储文件的逻辑结构组成了关系数据库的内模式。
视图是从一个或几个基本表或视图中导出的表,它本身并不独立存在,数据库中只存放视图的定义,而不存放它对应的数据,数据仍存放在原来的基本表中,因此视图只是一个虚表。
数据类型 | 含义 |
CHAR(n) | 长度为n的定长字符串 |
VARCHAR(n) | 最大长度为n的变长字符串 |
INT | 长整型(4字节) |
SMALLINT | 短整型(2字节) |
BIGINT | 大整型(8字节) |
FLOAT(n) | 可选精度的浮点数,精度至少为n位数字 |
BOOLEAN | 逻辑布尔量 |
DATE | 日期(YYYY-MM-DD) |
TIME | 时间(HH:MM:SS) |
操作对象 | 操作方式 | ||
创建 | 删除 | 修改 | |
模式 | CREAT SCHEMA | DROP SCHEMA | |
表 | CREAT TABLE | DROP TABLE | ALTER TABLE |
视图 | CREAT VIEW | DROP VIEW | |
索引 | CREAT INDEX | DROP INDEX | ALTER INDEX |
需要注意的是,SQL标准不提供修改模式和视图定义的语句,如果用户要修改模式或视图,只能先将它们删除然后重建。SQL标准也没有提供索引相关的语句,但为了提高查询效率,商用关系数据库管理系统都提供了索引机制。
在早期的数据库系统中,所有数据库对象都属于一个数据库,也就是说只有一个命名空间。而现代的关系数据管理系统提供了一个层次化的数据库对象命名机制。
一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象:数据库【模式(表、视图和索引)】
(1)定义模式:CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引等。
如果模式定义语句中没有指定<模式名>,<模式名>隐含为<用户名>。
例如:
为用户WANG定义一个模式TEST,并且在其中定义一个表TAB:
CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB(COL1 SMALLINT, COL2 INT);
(2)删除模式:DROP SCHEMA <模式名> <CASCADE|RESTRICT>;
CASCADE(级联),表示在删除模式的同时,把模式中的所有数据库对象删除;RESTRICT(限制),表示如果模式中定义了数据库对象,则拒绝该删除语句的执行。
(1)定义基本表:CREATE TABLE <表名> (<列名><数据类型> [列级完整性约束条件]...[表级完整性约束条件]);
建表的同时通常可以定义与该表有关的完整性约束条件,表的定义以及约束条件会被存放在数据字典中。
*数据字典是关系数据库管理系统的一组系统表,记录了数据库中所有的定义信息。关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典中相应的信息。
例如:
建立一个“学生”表Student,定义各列数据类型以及完整性约束条件:
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/
Sname CHAR(20) UNIQUE, /*列级完整性约束条件,Sname取唯一值*/
Ssex CHAR(2) NOT NULL, /*列级完整性约束条件,Ssex不能取空值*/
Sage SMALLINT,
Sdept VARCHAR(20),
Cpno CHAR(4), /*先定义Cpno的数据类型才能再将它设为外键*/
FOREIGN KEY (Cpno) REFERENCES Course (Cno)
/*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/
/*上面看不太懂的同学请翻到《数据库知识整理 - 关系数据库》看下“关系的完整性”的部分*/
);
区分列级完整性约束条件和表级完整性约束条件的方法比较简单——看约束条件短语的位置:在子句结尾是作为列级完整性约束条件,而在子句开头是作为表级完整性约束条件。
比如主码由两个属性构成:
PRIMARY KEY(Sno,Cno),
(2)定义基本表所属的模式有两种较简单的方法。一种方法是定义模式的同时定义基本表,就像上面定义模式的例子;另一种方法是在表名中直接给出:
CREATE TABLE "S-T".Student(...);
(3)修改基本表:ALTER TABLE <表名> [操作子句] ;
修改基本表主要有4个操作子句:
<1> ADD子句用于增加新列或新的完整性约束条件。如:
向Student表中增加“entrance(入学时间)”列:ALTER TABLE Student ADD entrance DATE;
增加课程名称必须取唯一值的约束条件:ALTER TABLE Student ADD UNIQUE(Cname);
<2> DROP COLUMN子句用于删除表中的列。如果指定了CASCADE短语,则自动删除引用了该列的所有对象,比如视图;如果指定了RESTRICT短语,则如果该列被其他对象引用,拒绝删除操作。
<3> ALTER COLUMN子句用于修改列原有的定义,包括列名和数据类型。如:
将年龄的数据类型从字符型转为整型:ALTER TABLE Student ALTER COLUMN Sage INT; /*相当于直接覆盖*/
<4>DROP CONSTRAINT子句用于删除完整性约束条件。
(4)删除基本表:DROP TABLE <表名> [RESTRICT|CASCADE];
RESTRICT是有条件的删除,存在任何依赖该表的对象,该表都不能被删除;CASCADE是无条件的删除,删除表的同时,所有依赖该表的对象也自动删除。
默认情况下是RESTRICT。
当表的数据量比较大时,建立索引是加快查询速度的有效手段。索引虽然能够加速数据库查询,但需要占用一定的存储空间。当基本表更新时,索引需要进行维护,这样又增加了数据库的负担,所以要有选择地创建索引。
索引建立在基本表的一列或多列上。
(1)建立索引:CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>]);
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录;CLUSTER表示要建立聚簇索引,这里暂时不作过多介绍。
<次序>有两种:ASC(升序)和DESC(降序),默认值为ASC。
举栗子:
为学生-课程数据库中的Student、Course和SC三个表建立索引。Student和Course表按学号(课程号)升序建唯一索引,SC表按学号升序,课程号降序建立唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Cousno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
(2)修改索引:ALTER INDEX <旧索引名> RENAME TO <新索引名>;
(3)删除索引:DROP INDEX <索引名>;
路过的圈毛君:“这里介绍的只是SQL的基本概念和基础功能。对于SQL语言,不同的数据库产品在处理策略上可能会与SQL的国际标准有所差别,所以使用具体的数据库系统时以用户手册的说明为准。”