SQL查询的艺术
上QQ阅读APP看书,第一时间看更新

第1章 数据库与SQL基础

目前应用最广泛的数据库系统是关系数据库系统,如SQL Server、Oracle、DB2等。关系数据库系统是通过SQL对数据库进行查询和更新的。本章主要介绍一些有关数据库和SQL的基础知识,为后面章节的学习打下基础。

1.1 数据库的基本概念

“数据库”一词起源于20世纪50年代,当时美国为了战争的需要,把各种情报收集在一起,存储在计算机里,称为Data Base(简称为DB)。

数据库的出现,使得计算机应用渗透到各个领域及各行各业,事务处理系统、管理信息系统、办公自动化系统、决策支持系统等都是使用了数据库技术的计算机应用系统。可以这样说,数据库系统是计算机信息系统的基础和主要组成部分。

1.1.1 数据库的由来

数据库主要用于数据处理。数据处理是对各种形式的数据进行收集、存储、加工和传播的一系列活动的集合。在使用计算机之后,数据处理速度及规模都有了巨大提高。随着数据处理量的不断增加,数据管理技术应运而生,其演变过程随着计算机硬件和软件的发展,大体经历了以下3个阶段。

1.人工管理阶段

20世纪50年代中期之前,计算机的软硬件均不完善。由于这个阶段还没有软件系统对数据进行管理,程序员在程序中不仅要规定数据的逻辑结构,还要设计其物理结构,包括存储结构、存取方法、输入/输出方式等。当数据的物理组织或存储设备改变时,用户程序就必须重新编写。不同的计算机程序之间不能共享数据,导致不同的应用之间存在大量的重复数据,很难保证应用程序之间数据的一致性。人工管理阶段程序与数据的关系如图1-1所示。

图1-1 人工管理阶段程序与数据的关系

2.文件系统阶段

20世纪50年代中期至60年代中期,操作系统的出现标志着数据管理进入了一个新阶段。数据以文件为单位,与计算机程序脱离,由操作系统统一管理。用户的程序与数据可分别存放在外存储器上,各个应用程序可以共享一组数据,实现了以文件为单位的共享。

但是,因为数据的组织仍然是面向程序的,所以存在大量的数据冗余,并且数据的逻辑结构不能方便地修改和扩充;同时,文件之间是相互孤立的,不能反映现实世界中事务之间的联系。文件系统阶段程序与数据的关系如图1-2所示。

图1-2 文件系统阶段程序与数据的关系

3.数据库系统阶段

20世纪60年代以后,随着计算机在数据管理领域的普遍应用,用户对数据管理技术提出了更高的要求,包括希望减少数据的冗余,提供更高的共享能力;要求程序和数据具有较高的独立性,当数据的逻辑结构改变时,不涉及数据的物理结构,也不影响应用程序,以降低应用程序研制与维护费用。数据库技术正是在这样一个需求的基础上发展起来的,它具有如下特点。

以数据为中心,通过组织数据形成综合性的数据库,为各应用共享。

数据冗余小,易修改、易扩充。不同的应用程序根据自己的需求,从数据库中获取需要的数据,减少了数据的重复存储,同时也便于增加新的数据结构。

采用一定的数据模型。数据模型不仅描述数据本身的特点,而且描述了数据之间的联系。

程序和数据具有较高的独立性。数据库系统通过映像使数据的物理结构独立于全局逻辑结构,也使全局逻辑结构独立于应用程序。

具有良好的用户接口,用户可以方便地开发和使用数据库。

对数据进行统一管理和控制,保证了数据的安全性、完整性。

在数据库系统阶段,程序与数据的关系如图1-3所示。

图1-3 数据库系统阶段程序与数据的关系

1.1.2 数据库系统的概念

实际上,数据库只不过是一些信息的聚集。通常意义下,“数据库”这个术语是指由数据库管理系统(DataBase Management System,简称DBMS)管理的数据集。一个数据库系统应该具有以下4种特性。

(1)允许使用数据定义语言(Data Definition Language),建立新的数据库,指定它们的模式(schema)。

(2)能够查询数据和更新数据,所使用的语言通常称为“查询语言”或“数据操作语言”。

(3)支持存储大量的数据,并且经过很长一段时间以后仍保证安全,使其免遭意外或非授权的使用,同时允许对数据库查询和更新的有效访问。

(4)控制多用户的同时访问,使一个用户的访问不影响其他用户,保证同时访问不会损坏数据。

1.2 数据库系统的结构、组成及工作流程

前面我们介绍了数据库系统的基本概念,本节将介绍数据库系统的体系结构、数据库系统的组成以及工作流程。

1.2.1 数据库的体系结构

数据库体系结构是数据库的一个总的框架。尽管实际的数据库系统软件产品多种多样、支持不同的数据模型、使用不同的数据库语言、建立在不同的操作系统之上,但绝大多数数据库系统在总的体系结构上,都具有三级模式的结构特性。

从另一个角度来讲,同一意义下的数据(如学生记录),从计算机中处理的二进制表示到用户处理的学生姓名等概念的数据之间,存在着许多层次的抽象和转换。数据库管理系统(DBMS)就是通过这三级模式来实现上述的转换。

数据库体系结构的三级模式为:外模式、概念模式和内模式,如图1-4所示。

图1-4 数据库系统的三级模式

1.内模式

内模式又称存储模式,是对数据的物理结构和存储方式的描述。例如,数据记录如何存储,是顺序存储还是按照索引存储,索引以什么方式组织等。内模式是由数据库系统提供的数据定义语言定义的。

2.概念模式

概念模式又叫作数据库模式(简称模式),是数据库中全部数据的逻辑结构的描述。概念模式以某种数据模型为基础,并用模式定义语言定义这些内容,它可以看作是现实世界中的实体在具体数据库系统中的实现。概念模式与具体的应用程序无关,同时也不涉及数据的存储细节和硬件环境。

3.外模式

外模式又称为用户模式或子模式,通常由概念模式导出,是概念模式的子集,其主要功能是定义允许用户操作的数据。我们可以将外模式理解为用户看到的数据视图,即与某一应用有关的数据的逻辑表示。不同用户的需求不同,使用的数据内容不同,对数据的保密要求不同,因此不同数据的外模式是不同的。

4.内模式/概念模式映像

内模式到概念模式之间的映像保证了数据的物理独立性。当数据的物理结构发生变化时,如对数据增加索引、改变数据的存储位置、改变存储设备等,不影响数据的逻辑结构。当数据库管理员根据应用程序对数据的存取要求对数据的物理组织进行优化后,并不需要对概念模式和外模式进行重新定义,也不需要修改应用程序。

5.概念模式/外模式映像

概念模式到外模式之间的映像保证了数据的逻辑独立性。当数据的整体逻辑结构发生变化时,如在概念模式中增加新的数据类型、在原有的记录类型间增加新的联系等,可以通过修改概念模式到外模式之间的映像而外模式不受影响。

数据库的这种多层次的体系结构,保证了高度的数据独立性,其中数据库的全局逻辑描述是独立于其他所有结构的。在定义数据库结构时,我们应首先定义概念模式。内模式是将概念模式中定义的数据进行适当地组织并加以存储,达到较好的运行效率。

1.2.2 数据库系统的组成

一个完整的数据库系统由数据库、数据库管理系统、软件支持系统、硬件系统和数据库管理员及相关人员5部分组成。

1.数据库

这里所说的数据库指的是物理数据库,是按照一定的数据模型组织并存放在外存储设备上的数据集合。例如,在学生选课信息管理系统中,应用程序获取的数据来自选课管理数据库,这个数据库中可能存放着学生信息、课程信息、教师信息等。

除了用户直接使用的数据外,还有另一类数据,它们是有关数据库的定义信息,如用户表及权限、数据库表的定义等。这些信息通常存放在数据字典中,用户一般不能改动数据字典的内容。

2.数据库管理系统—DBMS(DataBase Management System)

数据库管理系统是对数据进行管理的软件系统,是数据库系统的核心软件。数据库系统的一切操作,如创建表、视图、索引,向表中插入数据,对数据进行检索、修改、删除等,都是通过数据库管理系统实现的。

一般而言,数据库管理系统主要提供了数据定义、数据存储、数据库管理等功能。

3.软件支持系统

数据库系统的软件除了DBMS之外,还需要一个软件支撑环境,包括操作系统、应用系统开发工具、各种宿主语言以及实用程序等。

4.硬件支持系统

硬件支持系统主要是指计算机。对于分布式数据库而言,计算机网络也是基础环境。

5.数据库管理员及相关人员

数据库有关人员主要包括数据管理员(DBA)、系统分析员、应用程序员和普通用户。数据库系统中,不同人员可操控不同级别的数据,如图1-5所示。

图1-5 数据库人员可操控的抽象数据

1.2.3 数据库的工作流程

数据库系统的层次结构如图1-6所示。

图1-6 数据库系统层次结构图

下面我们以用户查询数据库中的一组数据为例,说明数据库系统的工作流程。数据库的工作流程图如图1-7所示。

图1-7 数据库工作流程图

(1)DBMS首先对数据查询语句进行语法检查,然后从数据字典中找到该用户对应的外模式,同时进行权限检查;若发现错误,则将错误信息返回给用户。

(2)DBMS根据找到的外模式,利用概念模式/外模式映像,将其映像到概念模式,确定概念模式应该读入哪些数据。

(3)DBMS利用内模式/概念模式映像,将概念模式映像到内模式,确定数据库应读入哪些物理记录及其具体的地址。

(4)DBMS根据地址信息向操作系统发出读取记录的命令。

(5)操作系统执行读取数据的命令,并将数据从硬盘读入系统缓冲区,将执行结果通知DBMS。

(6)DBMS根据查询语句及数据字典定义的信息,将系统缓冲区中的数据转换成用户所需的记录格式。

(7)DBMS将数据记录从系统缓冲区传送到用户工作区。

由此可见,在数据库系统中,数据库管理系统,即DBMS处于中心地位。

注意

DBMS并不是直接读取数据库中的数据,而是通过操作系统访问数据库,数据库系统是基于操作系统的。

1.3 关系数据库

目前广泛使用的数据库软件都是基于关系模型的关系数据库管理系统。关系模型是现代数据库产品最广泛实现的模型,正是关系模型构成了SQL的基础。采用关系模型的数据库称为关系数据库,而关系数据库管理系统(RDBMS)就是管理关系数据库的计算机软件。

1.3.1 关系模型

关系模型把世界看作是由实体(Entity)和联系(Relationship)构成的。所谓实体就是指现实世界中具有区分于其他事物的特征或属性,又与其他实体有联系的对象。在关系模型中,实体通常是以表的形式来表现的。表的每一行描述实体的一个实例,表的每一列描述实体的一个特征或属性。

关系是关系模型的核心,是汇集在表结构中的行和列的集合。每个关系由一个或多个属性(列)组成,属性将类型相似的数据归纳在一起。属性与关系直接的关联如图1-8所示。

图1-8 属性与关系

图1-8所示的关系是由NO、NAME、SEX、DEPARTMENT 4个属性组成的。数据以数组(行)的方式存储在关系中,每个数组代表相关数据的一个记录。

说明

关系、属性和数组这3个术语在涉及到关系模型时使用,SQL在描述这些术语时使用的是表、列和行。

所谓联系就是指实体之间的关系,即实体之间的对应关系。联系可以分为以下3种。

一对一的联系:第一个关系中的某个数组只能与第二个关系中的一个数组有关;同样,第二个关系中的某个数组只能与第一个关系中的一个数组有关。例如,NO关系和NAME关系之间是一对一的联系,对应于第一个关系列出的每个学号,第二个关系只能列出一个姓名,反之亦然。

一对多的联系:第一个关系中的某个数组可以与第二个关系中的一个或多个数组有关,但是第二个关系中的某个数组只能与第一个关系中的一个数组有关。例如,SEX关系和NO关系就是一对多的联系,反之,NO关系和SEX关系就是多对一的联系。

多对多的联系:在这种联系中,第一个关系中的某个数组可以与第二个关系中的一个或者多个数组有关,并且第二个关系中的某个数组也可以与第一个关系中的一个或者多个数组有关。例如,SEX关系和DEPARTMENT关系就是多对多的联系。

注意

多对多的联系在物理上实现时,必须在第一个关系和第二个关系之间添加第三个关系,以创建两个一对多的联系。如在图1-8中,SEX关系和DEPARTMENT关系通过NO关系就形成了两个一对多的联系。

1.3.2 Codd十二法则

关系数据库是由E.F.Codd博士于1970年在一篇名为“一种存储大型共享数据的关系模型”的论文中提出的。一个完美的、完全符合数据库技术的关系数据库系统,需要满足Codd博士提出的十二条法则。

信息法则:关系型数据库的所有信息都被清楚地表示成表中的数据,即表行中的列值。

授权存储法则:保证关系数据库中的每一个数据项,都可以通过“表名+主键+列名”的组合来访问。

NULL值的系统处理:DBMS对NULL值(未知或不可使用的数据)应提供系统支持。NULL值并不是零,也不是空白的字符串。

一个活跃的、在线数据字典应作为关系型表来储存:在逻辑上,数据库的描述及其内容都被表示为表的形式,并能用数据库语言进行查询。

必须提供数据存取语言进行存取访问:至少有一种具有严格、统一语法的语言,该语言必须支持数据定义、视图定义、数据操作、安全性、完整性约束规则、授权和事务处理。

视图更新法则:所有理论上能被更新的视图应当是可被系统更新的。

集合级的插入、更新和删除:DBMS不仅支持集合级上的检索,还应支持集合级的插入、更新和删除操作。

数据的物理独立性:应用不依赖于物理结构,当数据的存储结构或者物理存取方法改变时,应用程序在逻辑上应不受影响。

数据的逻辑独立性:如果一个表被分成两个部分,则可应用视图连接在一起,以便不会对应用产生影响。

数据完整性的独立性:数据库语言必须能够定义完整性规则,这些完整性规则应该储存在数据字典中。

分布独立性:一个数据库即使被分布,也应该能工作。

非破坏性原则:如果允许采用低级语言存取数据,则该低级语言一定不能绕过用数据库语言定义的安全性和完整性原则。

说明

虽然没有一个商业上可用的数据库完全遵循Codd的所有12条法则,但是Codd规则从历史的角度来看是重要的,这些规则有助于判断一个DBMS是否基于关系模型。

1.3.3 范式

构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有6种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就可以了。下面举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

1.第一范式(1NF)

在任何关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。第一范式主要包括以下指导原则。

数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或重复的属性。如果出现重复的属性,数据库就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。

表的每一行只包含一个实例的信息。

例如图1-9所示的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。

图1-9 员工信息表

2.第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

第二范式(2NF)要求数据库表中的每个实例或行必须是唯一的。为实现区分,我们通常需要为表加上一个列,以存储各个实例的唯一标识。如员工信息表中加上了员工编号EMP_ID列,每个员工的编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分,我们通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

3.第三范式(3NF)

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其他表中包含的非主关键字信息。例如一个部门信息表,其中每个部门有部门编号DEPT_ID、部门名称、部门简介等信息。那么我们在员工信息表中列出部门编号DEPT_ID后,就不能再将部门名称、部门简介等与部门有关的信息加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

1.4 SQL语言基础

SQL全称是“结构化查询语言(Structured Query Language)”,最早是IBM公司的圣约瑟研究实验室为其关系数据库管理系统SYSTEMR开发的一种查询语言。它的前身是SQUARE语言。

SQL语言结构简洁,功能强大,简单易学,因此自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是Oracle、SQL Server这些大型的数据库管理系统,还是Access这些常用的数据库开发系统,都支持SQL语言作为查询语言。

1.4.1 SQL的历史

在20世纪70年代初,E.E.Codd博士首先提出了关系模型。70年代中期,IBM公司在研制SYSTEM R关系数据库管理系统中研制了SQL语言,最早的SQL语言(SEQUEL2)是在1976年11月的IBM Journal of R&D上公布的。

1979年,Oracle公司首先提供商用的SQL,IBM公司在DB2和SQL/DS数据库系统中也实现了SQL。

1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3.135-1986),后来被国际标准化组织(ISO)采纳为国际标准。

1989年,美国ANSI采纳在ANSI X3.135-1989报告中定义的关系数据库管理系统的SQL标准语言,称为ANSI SQL 89,替代了ANSI X3.135-1986版本。该标准为下列组织所采纳。

国际标准化组织(ISO),为ISO 9075-1989报告——“Database Language SQL With Integrity Enhancement”。

美国联邦政府,发布在The Federal Information Processing Standard Publication(FIPS PUB)127。

1992年,SQL又出现了新版本SQL-92,或简称SQL2。SQL-92代表了SQL的主要版本,扩展并改进了早期版本的功能特性。7年之后,即1999年,SQL标准的最新版本SQL:1999发布,对SQL-92版本又新增了一些特性,标志着SQL在满足用户需求方面又前进了一大步。

说明

各数据库厂家都对SQL语言作了不同扩充,但都支持SQL语言的标准。本书主要针对主流的SQL-92版本进行讲解,对SQL:1999的一些新增特性也作了一些介绍。

1.4.2 SQL语言的组成

SQL可以创建、维护、保护数据库对象,并且可以操作对象中的数据,因此SQL被认为是一种完整的语言。依据SQL语言的执行功能,可以将SQL分为以下几部分。

数据定义语言(DDL,Data Definition Language):主要用于创建、修改或删除数据库对象,如表、视图、模式、触发器和存储过程等,与其相关的主要SQL关键字包括CREAT、ALTER和DROP。

数据查询语言(DQL,Data Query Language):主要用于数据的检索查询,与其相关的主要SQL关键字为SELECT。

数据操纵语言(DML,Data Manipulation Language):主要用于添加、修改或删除存储在数据库对象中的数据,与其相关的主要SQL关键字包括INSERT、UNPDATE和DELECT。

数据控制语言(DCL,Data Control Language):可以控制访问数据库中特定对象的用户,还可以控制用户对数据库的访问类型,与其相关的主要SQL关键字包括GRANT、DENY和REVOKE。

其他语言要素(Additional Language Elements):SQL除了包括上述4种功能语言外,还包括如事务控制、程序化语言等其他语言要素。

SQL语句数目种类较多,其主体大约由40条语句组成,如表1-1所示。

表1-1 主要的SQL语句

1.4.3 SQL语句的结构

所有的SQL语句均有自己的格式,如图1-10所示。

图1-10 SQL语句结构

每条SQL语句均由一个谓词开始,该谓词描述这条语句要产生的动作,如SELECT关键字。谓词后紧接着一个或多个子句(Clause),子句中给出了被谓词作用的数据或提供谓词动作的详细信息。每一条子句由一个关键字开始,如WHERE。

1.4.4 SQL的优点

1.非过程化语言

SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集。所有SQL语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。SQL不要求用户指定对数据的存放方法。

这种特性使用户更易集中精力于要得到的结果。所有SQL语句都使用查询优化器,它是关系数据库管理系统(RDBMS)的一部分,由它决定对指定数据最快速度存取的手段。查询优化器知道存在什么索引,在哪儿使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。

2.统一的语言

SQL可用于所有用户的数据库活动模型,包括系统管理员、数据库管理员、应用程序员、决策支持系统人员及许多其他类型的终端用户。基本的SQL命令只需很少时间就能学会,最高级的命令在几天内也可掌握。SQL为许多任务提供了以下命令。

查询数据

在表中插入、修改和删除记录

建立、修改和删除数据对象

控制对数据和数据对象的存取

保证数据库一致性和完整性

以前的数据库管理系统为上述各类操作提供单独的语言,而SQL将全部任务统一在一种语言中。

3.是所有关系数据库的公共语言

由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。所有用SQL编写的程序都是可以移植的。

1.4.5 SQL的执行

除了定义如何使用语言外,SQL:1999标准还详细说明了如何执行SQL语句——共用4种执行方法。

直接调用:利用这种方法,可以从前端应用程序,如SQL Server中的Query Analyzer(查询分析器)、Oracle中的SQL*Plus Worksheet,直接与SQL服务器上的数据库进行通信。我们只要把查询输入到应用程序窗口,然后执行SQL语句,就可以获取查询结果。这种方法可以迅速检查数据、验证连接和观察数据库对象。

说明

本书中,SQL代码实例均是在SQL Server中的Query Analyzer(查询分析器)环境下直接实现的。

嵌入式SQL:在这种方法中,SQL语句直接编码(嵌入)在主机编程语言中。例如,我们可以将SQL语句嵌入C应用程序代码中。在编译代码之前,预处理器将分析SQL语句,并把这些语句从C代码中分离出来。SQL代码被转换成一种能为RDMS理解的格式,其余的C代码则按照正常的方式进行编译。

模块绑定:这种方法可以创建和主机编程语言相分离的SQL语句代码块,即模块。模块在创建后就被组合到应用程序中。

CLI(调用层接口):通过把作为参数值的SQL语句传递到子例程,CLI可以通过接口调用SQL语句。这些语句在嵌入式SQL和模块绑定中,并不进行预编译,RDMS将直接执行这些语句。

虽然直接调用不是最通用的方法,但是因为它直接将查询提交给数据库,并且可以立即生成结果,所以本书采用了这种方法。在实际应用中,嵌入式SQL是最常用的方法。本书的第19章将对嵌入式SQL、模块绑定、CLI进行详细讨论。

1.5 SQL环境

SQL环境实际上可以理解为一个框架,数据在其中可以存在,而数据的SQL操作在其中可以执行。

1.5.1 环境

实际上,可以把SQL环境看作是运行在某个设备上的数据库管理系统。SQL环境由很多组件构成,各组件协同工作,以支持SQL操作,如创建和修改对象、存储和查询数据,修改和删除数据等。这些组件加起来构成一个模型,RDBMS以该模型为基础。

基本的数据库元素,比如基本表、视图,都是在SQL环境中定义的。这些元素组成了层次结构,每个元素起着不同的作用。SQL环境中元素的体系结构如图1-11所示。

图1-11 SQL环境中元素的体系结构

说明

图中的群集是目录的聚集。每个用户都有相关的群集,也就是该用户可以访问的所有目录的集合。群集是数据库可以操作的最大范围,因此,对于特定的用户,群集就是“数据库”。

1.5.2 SQL的层次结构

目录是SQL环境的重要组分,是模式的集合。这里我们可以把目录看作是一个继承结构,继承结构的顶部是SQL环境,目录是父对象,模式是子对象,如图1-12所示。

图1-12 目录的层次结构

1.模式对象

模式对象位于目录的底层,是包含在模式中的相关组件的集合。SQL数据就存储在这一层。通过使用SQL,我们就可以定义SQL对象,修改、存储和操作对象中的数据。实际上,本书所做的大部分工作都直接影响到模式对象。

SQL:1999定义了基本表、视图、域、约束、触发器等11种类型的模式对象,这些对象构成了SQL环境的基础。

2.模式(Schema)

这里的模式是指数据库模式,而不是关系模式,是表、视图、域等数据库模式对象的聚集。模式是整个SQL环境体系结构的基本单位。SQL中,模式的创建采用CREATE SCHEMA语句,其语法如下。

    CREATE SCHEMA <模式名> <模式元素>

比如创建一个学生模式,包括学生、课程和学生选课等3个关系以及计算机系学生视图,其说明简要描述如下。

    CREATE SCHEMA StudentSchema
    CREATE TABLE Student
    CREATE TABLE Course
    CREATE TABLE StudentCourse
    CREATE VIEW ComputerDeptStud

如果要把学生模式作为当前模式,可如下设置。

    SET SCHEMA StudentSchema

于是,随后定义的表、视图等模式元素均属于学生模式。

3.目录(Catalog)

目录是模式的聚集,即每个目录都有一个或多个模式。在一个目录中,模式的名字必须是唯一的。每个目录都包含INFORMATION-SCHEMA(信息模式)特殊模式,该模式包含该目录中所有模式的信息。

在目录中建立模式类似于在模式中建立表或视图之类的模式元素。可以用如下语句建立学生目录。

    CREATE CATALOG StudentCatalog

它后面跟着属于学生目录的模式及模式的说明。可以用SET CATALOG(设置目录)语句设置当前目录。例如,要把学生目录作为当前目录,可如下设置。

    SET CATALOG StudentCatalog;

于是,随后定义的模式将属于学生目录。

1.5.3 客户程序和服务程序系统

服务程序一般运行在存有数据库的大型主机上,而客户程序一般运行在另一台主机上。当然,有时客户程序和服务程序也会运行在同一台主机上。SQL的客户程序和服务程序与连接、会话和模块这3个概念紧密地联系在一起。SQL的客户程序和服务程序的相互作用如图1-13所示。

图1-13 客户程序和服务程序的相互作用

1.连接

连接把客户程序和服务程序连接起来。可用如下的SQL连接语句,在客户程序和服务程序之间打开连接。

    CONNECT TO <服务程序名>
    AS <连接名>

我们一般把服务器名作为服务程序名。

说明

用户可以打开几个连接,但在任何时间只能有一个是活动的。

2.会话

当连接激活时,所执行的SQL操作将在客户程序和服务程序之间形成请求——响应式的交往,这种操作序列被称为会话(Session)。

会话与建立它的连接处于同一状态。当连接处于待用状态时,会话也处于待用状态,当连接被激活时,会话也被激活。每个会话都有当前目录和该目录中的当前模式。

3.模块

SQL2标准建议SQL实现至少为用户提供以下3种类型的应用程序(称为模块,Module)之一。

通用SQL接口

嵌入式SQL

实际模块

模块的执行称为SQL代理,图1-13给出了一个模块和一个SQL代理,并且把二者作为一个整体,调用SQL客户程序来建立连接。

注意

模块与SQL代理之间的差别类似于程序和处理之间的差别,前者为代码,而后者是代码的执行。

1.5.4 SQL环境中对象的命名规则

在研究SQL之前,我们有必要介绍一下SQL对象标识符。标识符为SQL对象赋予名称,最多可以达到128个字符,且必须遵守一定的规则。SQL语句创建的任何对象,如表、列、视图或模式等,都必须有名字,也就是标识符。

SQL:1999标准定义了两种类型的标识符,即正则标识符和定界标识符,二者具有不同的约定。实际应用中,采用最多的是正则标识符规则,因此这里只介绍正则标识符规则,简述如下。

标识符名称不区分大小写,即大小写是等效的,如StudentName等同于STUDENTNAME和studentname。

标识符只允许使用字母、数据和下划线,可以创建如First_Name,Table1之类的标识符。

不允许使用SQL保留关键字。

说明

关键字是一个单词,是SQL词汇的一部分。SQL关键字有两种类型:保留关键字和非保留关键字。保留关键字只能用在SQL语句中,而不能用于其他任何用途。非保留关键字则没有这样的限制。

一个完整的模式对象标识符应包括目录的名称、模式的名称和模式对象的名称,各个名称之间以点(.)隔开。如Student表在StudentSchema模式中,而这个模式又在StudentCatalog目录中,那么该表完全合格的名称就是StudentCatalog.StudentSchema.Student。