SQL查询的艺术

978-7-115-33340-7
作者: 张权
译者:
编辑: 陈冀康

图书目录:

详情

本书不仅全面地介绍了SQL语句,并且兼顾了其在各数据库产品中的实现,特别是对SQL Server和Oracle。本书共分20章,以数据定义、数据查询、数据操纵、数据控制、事务控制和程序化SQL的顺序讲解SQL编程的基础知识。全书共包括大小实例300多个,突出了速学速查的特色,各小节以SQL语句的关键词命名,便于检索查询。

图书摘要

版权信息

书名:SQL查询的艺术

ISBN:978-7-115-33340-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    张 权 郭天娇

  责任编辑 陈冀康

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL是数据库领域的一种标准语言。任何需要从事数据库相关工作的程序员,都必须学习和掌握SQL。

本书全面地介绍了数据库的基础知识和SQL查询的技巧,通过丰富的实例,帮助读者掌握常见的SQL应用。全书共分19章,按照数据定义、数据查询、数据操纵、数据控制、事务控制和程序化SQL的顺序,详细地讲解SQL编程的基础知识。全书共包括大小实例近300个,突出了实例教学、学用结合的特点。

本书适合于学习SQL编程的读者阅读,尤其适合于SQL初学者阅读;本书对数据库架构师、数据库管理员也有一定的参考价值。


关系数据库已经成为数据库系统的主流。目前广泛使用的数据库软件都是基于关系模型的。SQL的全称是Structured Query Language(结构化查询语言),是关系数据库中最常用的语言。SQL不仅可以用来管理数据库中的数据,还可以用来管理关系数据库本身。读者可以通过交互式客户端应用程序利用SQL直接访问SQL数据库。本书从SQL基本知识开始,结合流行的数据库软件(SQL Server和Oracle),讲述了数据操作与系统管理的方方面面。

 内容全面、结构清晰、查询方便

本书依照SQL语句要素,按照数据定义、数据查询、数据操纵、数据控制、事务控制和程序化SQL的顺序讲解SQL语言,内容全面。

本书中,大多数SQL语句都是采用“语法、说明、实例、实例代码、运行结果”的顺序结构来阐述的,方便读者学习和速查。

 实例丰富、紧密结合实际应用

本书共包括大小实例321个,可以让读者在学习SQL语言原理的同时掌握其用法。

本书还兼顾了SQL语句在各数据库产品中的实现。对于SQL Server和Oracle中差别不大的语句,本书在实例部分只介绍其在SQL Server中的实现过程;而对于SQL Server和Oracle中差别比较大的语句,本书在实例部分分别介绍其在SQL Server和Oracle中的实现。

第1章是本书的开篇,主要介绍了关系数据库和关系模型,这些是SQL的基础。本章还从整体上介绍了SQL以及SQL环境的组成。

第2章是本书的预备知识,简单介绍了常用的关系数据库系统SQL Server的基本情况,以及它支持的SQL扩展语言Transact-SQL的基本概念和主要内容,为后面介绍SQL的具体应用打下了基础。

第3章主要介绍了SQL中常用的数据类型以及SQL中表的定义语句,其中讲解了使用CREATE TABLE语句创建表,使用ALTER TABLE语句修改表(包括增加列、删除列和修改列),以及使用DROP TABLE语句删除表。

第4章介绍了索引、视图的基本概念,在SQL中创建、销毁索引和视图的语法及实现实例,并且给出了它们的使用原则。

第5章介绍了SQL查询语句(SELECT语句)的基本语法结构和执行步骤,主要介绍了一些常用的简单查询,包括列的查询、使用ORDER BY子句对查询结果排序,同时介绍了使用条件字句WHERE为查询设置简单搜索条件。

第6章介绍了在WHERE子句中经常使用的复杂的条件查询,包括组合查询条件、IN运算符、NOT运算符,以及使用LIKE运算符和通配符进行模糊查询等。

第7章介绍了在SQL数据查询时,如何通过连接符、数学运算以及函数等在查询过程中对数据进行一些处理,并且将处理后的结果提供给用户。

第8章介绍了在SQL中如何运用聚合函数对数据进行聚合分析。在使用聚合函数时,本章还介绍了使用GROUP BY子句进行分组聚合分析以及使用HAVING子句对分组信息进行进一步筛选。

第9章从基本的连接入手,介绍了表的自连接、自然连接、内连接和外连接,其中内连接介绍了等值连接和不等值连接两种基本形式;外连接介绍了左外连接、右外连接和全外连接。

第10章讲解了子查询,包括创建和使用返回单值的子查询、返回多行的子查询、相关子查询和嵌套子查询等内容。

第11章介绍了使用INSERT语句向表中插入数据,详细介绍了单行记录、多行记录的插入以及表中数据的复制操作,还介绍了数据库中经常用到的数据的导入/导出操作。

第12章介绍了使用UPDATE语句更新表中的数据和使用DELETE语句删除表中的数据,分别介绍了更新和删除表中的一行、多行以及所有行数据的操作。

第13章介绍了SQL对数据库的安全性控制功能;在介绍SQL安全模式的基础上,详细介绍了SQL中的角色管理与权限管理;最后,对SQL Server和Oracle中的安全管理进行了详细的论述。

第14章介绍了与表有关的约束:NOT NULL约束、UNIQUE约束、PRIMARY KEY约束、FOREIGN KEY约束和CHECK约束、域约束以及断言,最后对SQL Server提供的规则对象与缺省值对象作了详细介绍。

第15章介绍了SQL中的存储过程与函数。本章主要以SQL Server数据库为例,结合实例讲解了存储过程和函数的开发调用过程,最后对Oracle的存储过程与函数开发作了简单的介绍。

第16章介绍了SQL中触发器的有关概念和操作。

第17章介绍了SQL中通过游标提取和维护数据的方法,然后详细介绍了在SQL Server和Oracle中,游标的扩展应用实例。

第18章介绍了事务的概念、事务控制的实现以及多用户访问数据库的并发控制,然后介绍了在SQL Server和Oracle中并发控制的具体实现。

第19章介绍了嵌入式SQL的基本概念及其应用,然后通过具体的实例详细阐述了在C语言中嵌入SQL语句访问SQL Server和Oracle的过程。

本书具有知识全面、讲解细腻、指导性强等特点,力求以全面的知识及丰富的实例指导读者掌握SQL编程的基础知识。

本书由张权和郭天娇编写,其中,张权编写了本书第1~10章,郭天娇编写了第11~19章。

张权,现为天津红翔吉瑞网络科技有限公司CEO,硅谷访问学者,国内顶级数据库专家,主研移动终端与大数据交互;拥有多家上市公司移动终端解决方案实施经验,曾为国内外多家知名互联网企业提供移动终端技术咨询服务。

郭天娇,现就职于吉林工程技术师范学院,长期从事计算机科学与技术及软件工程专业的教学与科研工作。

本书结构清晰、讲解精炼,并辅以了大量实例,便于新手理解和学习SQL,另外本书也可以作为数据库开发人员的参考手册,适合PHP、Java、.NET等各类程序员使用。


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

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

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

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

1.人工管理阶段

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

2.文件系统阶段

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

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

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

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

3.数据库系统阶段

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

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

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

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

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

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

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

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

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

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

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

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

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

1.内模式

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

2.概念模式

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

3.外模式

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

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

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

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

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

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

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

1.数据库

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

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

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

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

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

3.软件支持系统

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

4.硬件支持系统

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

图1-8 属性与关系

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

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

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

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

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

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

构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有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)也应该构建它,否则就会有大量的数据冗余。

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

SQL语言结构简洁,功能强大,简单易学,因此自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是Oracle、SQL Server这些大型的数据库管理系统,还是Access这些常用的数据库开发系统,都支持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版本。该标准为下列组织所采纳。

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

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

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

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

表1-1 主要的SQL语句

模 块

语 句

功 能

数据定义

CREATE TABLE

创建一个数据库表

DROP TABLE

从数据库中删除表

ALTER TABLE

修改数据库表结构

CREATE VIEW

创建一个视图

DROP VIEW

从数据库中删除视图

CREATE INDEX

为数据库表创建一个索引

DROP INDEX

从数据库中删除索引

CREATE PROCEDURE

创建一个存储过程

DROP PROCEDURE

从数据库中删除存储过程

CREATE TRIGGER

创建一个触发器

DROP TRIGGER

从数据库中删除触发器

CREATE SCHEMA

向数据库添加一个新模式

DROP SCHEMA

从数据库中删除一个模式

CREATE DOMAIN

创建一个数据值域

ALTER DOMAIN

改变域定义

DROP DOMAIN

从数据库中删除一个域

数据查询

SELECT

从数据库表中检索数据行和列

数据操纵

INSERT

向数据库表添加新数据行

DELETE

从数据库表中删除数据行

UPDATE

更新数据库表中的数据

数据控制

GRANT

授予用户访问权限

DENY

拒绝用户访问

REVOKE

解除用户访问权限

事务控制

COMMIT

结束当前事务

ROLLBACK

中止当前事务

SET TRANSACTION

定义当前事务数据访问特征

程序化SQL

DECLARE

为查询设定游标

EXPLAN

为查询描述数据访问计划

OPEN

检索查询结果打开一个游标

FETCH

检索一行查询结果

CLOSE

关闭游标

PREPARE

为动态执行准备SQL

EXECUTE

动态地执行SQL

DESCRIBE

描述准备好的查询

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

图1-10 SQL语句结构

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

1.非过程化语言

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

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

2.统一的语言

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

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

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

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

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

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

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

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

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

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

图1-11 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;

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

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

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

1.连接

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

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

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

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

2.会话

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

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

3.模块

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

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

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

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

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

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

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


相关图书

SQL实践教程(第10版)
SQL实践教程(第10版)
SQL初学教程(第3版)
SQL初学教程(第3版)
SQL学习指南(第3版)
SQL学习指南(第3版)
SQL入门经典(第6版)
SQL入门经典(第6版)
SQL优化核心思想
SQL优化核心思想
SQL初学者指南(第2版)
SQL初学者指南(第2版)

相关文章

相关课程