第3章关系数据库标准语言SQL
SQL(Structured Query Language)是关系数据库的标准语言,也称结构化查询语言。它是介于关系代数和元组演算之间的一种语言。SQL是一种综合性的数据库语言,实现对数据的定义、操纵和控制等功能。本章将对SQL的语法规则进行详细的介绍。
3.1SQL概述3.1.1SQL的发展自从1970年美国IBM研究**的E.F.Codd提出关系模型,并连续发表多篇论文以后,人们对关系数据库的研究日益深入。1972年,IBM公司开始研制实验型关系数据库管理系统SYSTEM R,并且为其配置了SQUARE(Specifying Queries As Relational Expression)查询语言。1974年,Boyce和Chamberlin在此基础上对其进行改进,将SQUARE语言改为SEQUEL(Structured English Query Language),后来SEQUEL简称为SQL,即“结构式查询语言”,并首先在IBM公司研制的关系数据库系统System R上实现。
由于它具有功能丰富、使用方便灵活、语言简洁、易学等突出优点,深受计算机工业界和计算机用户的欢迎。各厂商纷纷开发基于SQL的商业应用产品,并将SQL作为关系数据库产品事实上的标准,如Oracle、DB2、Sybase等。1986年10月,经美国**标准局(ANSI)的数据库委员会X3H2批准,将SQL作为关系数据库语言的美国标准,同年公布了标准SQL。1987年6月,国际标准化组织(International Organization for Standardization,ISO)将其采纳为国际标准。这两个标准现在称为“SQL 86”。ANSI在1989年10月颁布了增强完整性特征的SQL 89标准,1992年又公布了SQL 92标准,1999年发布了SQL 99,以后每隔几年会推出一个新版本,目前*近的版本是SQL 2016。
本章的论述主要遵循SQL 92标准,由于各数据库厂商的SQL产品在支持标准SQL 92语法的同时,在功能上都做了相应的扩充,在实现上略有不同,因此,在使用具体的DBMS时,请查阅系统提供的参考手册。
3.1.2SQL的特点
SQL有许多优点,主要体现在以下4点。
1. 高度非过程化
“过程化”是指用户不但要知道“做什么”,还应该知道“怎样做”。对于SQL,用户只需要提出“做什么”,无须具体指明“怎么做”。例如,存取路径选择、具体处理操作过程等均由系统自动完成。这种特点使得用户更能集中精力考虑要“做什么”和所要得到的结果,大大提高了开发效率。
2. 功能完备并且一体化
数据库的主要功能就是通过数据库支持的数据语言来实现的。SQL不但具有数据定义功能、数据查询、数据操作功能、数据控制功能,而且这些功能被集成到一个语言系统中,只要用SQL就可以实现数据库生命周期中的全部活动。可见,SQL功能是完备的。
3. 统一的语法结构
SQL可用于所有用户的模型,包括系统管理员、数据库管理员、应用程序员及终端用户,这些用户可以通过自含式语言和嵌入式语言两种方式对数据库进行访问,这两种方式使用统一的语法结构。
4. 语言简洁,易学易用
尽管SQL的功能很强,但语言十分简洁,SQL完成核心功能只用了以下8个动词。
数据查询: SELECT(查询)。
数据定义: CREATE(创建),DROP(撤销)。
数据操作: INSERT(插入),UPDATE(修改),DELETE(删除)。
数据控制: GRANT(授权),REVOKE(收权)。
3.1.3SQL体系结构
SQL支持关系数据库体系结构,即外模式、模式和内模式。利用SQL可以实现对三级模式的定义、修改和数据的操作功能,在此基础上形成了SQL体系结构,如图31所示。
图31SQL体系结构
图31中对应的几个基本概念如下。
(1) SQL用户。可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,也可以作为独立的用户接口,供交互环境下的终端用户使用。
(2) 基本表,简称基表。它是数据库中实际存在的表,在SQL中一个关系对应于一个基本表。
(3) 视图。SQL用视图概念支持非标准的外模式概念。视图是从一个或几个基表导出的表,虽然它也是关系形式,但它本身不实际存储在数据库中,只存放对视图的定义信息(没有对应的数据)。因此,视图是一个虚表(Virtual Table)或虚关系,而基表是一种实关系(Practical Relation)。
(4) 存储文件。每个基表对应一个存储文件,每个存储文件都与外部存储器上一个物理文件对应。一个基表还可以带一个或几个索引,存储文件和索引一起构成了关系数据库的内模式。
由此可以看出,一个基本表可以存放在多个存储文件中,一个存储文件也可以存放多个基本表的数据; 一个视图可以来自多个基本表,一个基本表可以构造多个视图; 一个用户可以查询多个视图,一个视图也可以被多个用户访问。
3.2SQL的定义功能3.2.1基本表的定义1. 表结构的定义
建立数据库*重要的一步就是定义基本表的结构。SQL用于创建基本表的语法结构为: CREATE TABLE <表名>
(<列名> <数据类型> [列级完整性约束条件]
[,<列名> <数据类型> [列级完整性约束条件] …]
[,<表级完整性约束条件>];说明:
(1) 表名是所要定义的基本表的名字,表可以由一个或多个属性(列)组成。
(2) 定义表的各个列时需要指明其数据类型及长度。表31列出了主要数据类型。表31SQL 92提供的主要数据类型类型数据类型举例及缩写说明BinaryBinaryLargeOBject(BLOB)这种数据类型以十六进制格式存储二进制字符串的值BitStringBIT(n)
BIT VARYING(n)这两种数据类型可以存储二进制和十六进制数据,BIT数据类型长度固定,而BIT VARYING数据类型具有可变长度BooleanBOOLEAN这种数据类型存储真、假值——true、false或unknownCharacterCHAR(n)
VARCHAR(n)
这两种数据类型可以存储适宜的字符集中的任意字符组合。VARCHAR数据类型允许字符长度变化,而CHAR数据类型只能有固定的字符长度。VARCHAR数据类型自动删除后继的空格,而CHAR数据类型则添加空格达到指定长度NumericINTEGER
SMALLINT
DECIMAL(i,j)
FLOAT(p,s)
REAL
DOUBLE PRECISION这些数据类型存储数据的准确值(整数或小数)或近似值(浮点数)续表
类型数据类型举例及缩写说明TemporalDATE
TIME
TIMESTAMP
INTERVAL这些数据类型处理时间的值。DATE 和TIME分别处理日期和时间。TIMESTAMP类型存储着按机器当前运行时间计算出来的值。INTERVAL指定一个时间间隔,它是一个相对值,用于增加或减少一个日期、时间或时间戳类型数据的**值
(3) 完整性约束条件。关系完整性约束包括实体完整性、参照完整性和用户定义完整性。这三种完整性约束条件都可以在表的定义中给出。其中,实体完整性定义表的主关键字(Primary Key),参照完整性定义外关键字(Foreign Key),用户定义完整性根据具体应用对关系模式提出要求,主要包括对数据类型、数据格式、取值范围、空值约束等的定义。
完整性约束,又可分为列完整性、元组完整性和表级完整性三个级别。在关系模式的定义中,*常定义的是列完整性约束和表级完整性约束。用户定义的完整性规则属于列级完整性约束,而实体完整性和参照完整性都属于表级完整性约束。
由于完整性约束条件也是关系模式定义的一部分,所以下面给出部分完整性约束条件的定义方法。这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由DBMS自动检查该操作是否违背这些完整性约束条件。
【例31】建立一个“学生”表,它由学号、姓名、性别、出生年份、籍贯和所在学院6个列组成,其中,学号属性不能为空,并且其值是**的。CREATE TABLE 学生
( 学号 CHAR(8) NOTNULL UNIQUE,
姓名 CHAR(8),
性别 CHAR(2),
出生年份 SMALLINT,
籍贯 CHAR(8),
学院 CHAR(15));上述SQL语句执行后,将建立一个新的空“学生”表。其中,NOT NULL 和UNIQUE分别说明学号不能取空值和重复的值,该约束等同于主码的约束。