目录
一、SQL 简史
二、数据库简史
1、Dr. Codd's 对关系型数据库系统的十二条规则
2、设计数据库的结构
3、数据库的前景
4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下:
5、交互式语言
6、易于实现
7、SQL 总览
三、流行的 SQL 开发工具
1、Microsoft Access
2、Personal Oracle7
3、Microsoft Query
4、开放型数据库连接(ODBC)
四、SQL 在编程中的应用
摘要
问与答
校练场
1 为什么说SQL是一种非过程型语言
2 我如何知道一种数据库系统是不是关系型数据库系统
3 我可以用SQL来做什么
4 把数据清楚地分成一个个唯一集的过程叫什么名字
SQL 的诞生于 IBM 公司在加利福尼亚 San Jose 的试验室中,在七十年代 SQL 由这里开发出来, 最初它们被称为结构化查询语言 Structured Query Language ,并常常简称为 sequel 开始时它们是为 IBM 公司的 DB2 系列数据管理系统 RDBMS — — 关系型数据库管理系统, 而开发的您在今天仍可以买到在不同平台下运行的该系统 ,事实上是 SQL 造就了 RDBMS 它是一种非过程语言 与第三代过程语言如 C 和 COBOL 产生于同一时代。
注 :非过程性语言的意思就是指与具体过程无关 ,举例来说 SQL 描述了如何对数据 进行检索、 插入 、删除 ,但它并不说明如何进行这样的操作。
这种特性将RDBMS从DBMS中区别开来, RDBMS提供了一整套的针对数据库的语言 ,而且对于大多数的 RDBMS 来说 ,这一整套的数据语言就是 SQL 这里一整套的意思, 就是对数据和处理操作语言是一些过程的集合。
有两个标准化组织 美国国家标准协会 ANSI和国际标准组织(ISO)正致力于SQL,在工业领域的标准化应用工作, 尽管该标准要求所有的数据 库设计者应遵守这一标准 ,然而所有的数据库系统所用的 SQL 均与 ANSI-92 存在一定的 差异, 此外, 大多数数据库系统对 SQL 进行了有针对性的扩展使它们成为了过程型语言 ,我们对不同的 RDBMS 系统给出了它们的 SQL 语言例句 ,希望你能从中发现它们的共性 。
对数据库的发展历程有一个简要的了解可以使您更清楚如何使用 SQL 来工作, 数据库系统在商业领域应用极为广泛 ,大到航空机票售票系统, 小到孩子们的棒球卡管理系统, 数据库将按照我们的意愿来存储和处理这些数据 ,直到最近几年以前 大型的数据库系统仍只能在大型机上运行, 而大型机的运行 维护 使用费用均是非常昂贵的, 然而在今天 工作站的能力强大到可以让编程人员以极快的速度和极低的价格来设计和发布软件。
关系型数据库是最为流行的数据存储模式 ,它产生于一个名称为 A Relational Model of Data for Large Shared Data Banks 的论文中, SQL 进而发展为关系型的数据库 ,对于关系 型数据库 Dr.Codd's定义了12条规则使之与其他类型的数据库相区别:
0 关系型数据库必须通过关系来实现对数据的完全管理;
1 所有在关系型数据库中的信息均可以在表中以数值的形式加以体现;
2 在关系型数据库中的每一项数据均可以通过库名、 键名和列名来准确指定;
3 关系型数据库系统必须对空值 、未知的和违规的数据 提供系统级的支持 ,有独特的缺省值 而且具有独立域 {这一段不太清楚};
4 活动的 即时的数据联合— —它的意思就是在数据库中的数据应有逻辑表格的行的形式来表达, 并且可以通过数据处理语言来访问;
5 完善的数据子语句— —它应该至少支持一种有严格语法规则和功能完善的语言 ,并且应该支持数据和定义 处理 完整性 权限以及事务等操作;
6 查看更新规则— —所有在理论上可以更新的视图可以通过系统操作来更新;
7 数据库中数据和插入 、更新与删除操作— —该数据库系统不仅要支持数据行的访问 ,还要支持数据和的插入、 更新和删除操作;
8 数据和物理独立性— —当数据在物理存储结构上发生变化时应用程序在逻辑上不应受到影响;
9 数据的逻辑独立性— —当改变表的结构时应用程序在最大程度上不受影响;
10 有效性独立— —数据库的语言必须有定义数据完整性规则的能力 数据应即时存储在线目录 而且在处理时必须通过这一五一节;
11 发布的独立性— —当数据第一次发布或当它重新发布时应用程序应不受影响;
12 任何程序不可能使用更低级的语言从而绕过数据库语言的有效性规则定义 大多数数据库具有父/子关系, 这就是说在父结点中保存有子结点的文件指针 见下图:
这种方式有优点也有缺点,它的好处在于它使得数据在磁盘上的物理存储结构变得不再重要, 编程人员只需存储下一个文件的指针就可以实现对下一个文件的访问 ,而且数据 的添加和删除操作也变得非常容易 ,可是不同组的信息想要联合为一个新组就变得困难了 ,这是因为在这种方式下数据在磁盘上的存储格式不能在数据库建立以后再强制性地改变 如果需要这样做那就必须重新建立一个数据库结构。
Codd's 的关系型数据库思想借用的逻辑代数的思想 ,使得数据的子集与父级之间具有 平等的地位
由于信息可以很自然地组织在不同的表格中 ,Dr. Codd 也以这种方式来组织他所提出 的数据库 在关系模式下, 数据被存入类似于表格的结构中, 这种表格由独立的数据元组 被称为列或字段 ,所组合而成 一组数据信息被存储为一行 ,举例来说 创建一个包括 雇员内容的关系型数据库 ,我们可以很容易地从雇员表开始, 而像这样的表在很容易得到的,该表中包含有如下信息、 姓名 、年龄 、职业这三项数据用作雇员表的字段 整个表,如下表所示:
姓名 |
年龄 |
职业 |
Will Williams |
25 | Electrical Engineer |
Dave Davidson |
34 | Museum Curator |
Jan Janis |
42 | Chef |
Bill Jackson |
19 | Student |
Don DeMarco |
32 | Game programmer |
Becky Boudreaux |
25 | Model |
在这个表中有六行记录 ,为了从中找到特定的记录 ,举例来说 Dave Davidson 用 户可以望知数据库管理系统在数据库中检索满足条件 姓名= Dave Davidson 的记录 ,如果数据库管理系统已经检索过了全部的数据, 那么它将会把满足条件的的姓名、 年龄、 职业三项的记录返回给用户 SQL 会通知 DBMS 找什么样的数据 ,这一检索过程的 SQL 例句如下:
SELECT * FROM EMPLOYEE
在这里不要刻意去记它的语句, 我们在明天将会对它进行更为详细的讨论。
由于通过明显的关系可以特不同的数据项归结在一起, 比如雇员的姓名和雇员的年龄, 所以关系性数据库管理系统对如何来描述数据之间的关系给出了相当大的弹性, 通过 精确的的连接和联合运算, 关系型数据库管理系统可以非常迅速地从不同的表中将所需要 的数据联合 见联合运算图 ,然后返回给用户或程序 ,这种联合的特性允许数据库的设计 者将数据信息存储在不同的表中以减少数据的冗余度。右图则反映了相交运算 ,相交运算地意思就是取出两个或多个库所共有的部分:
这里有一个简单的例子来显示数据是如何进行逻辑处理的 ,表 1-2 是一个被称为 报 告 的表 它的里边有两个字段 姓名和工作:
在雇员数据库中的年龄和职业字段在每一个记录中均出现重复是不合适的 而且随着 时间的进行 这些冗余的数据将会占用大量的磁盘空间且使得数据库管理系统在检索数据所耗用的时间增多 可是 如果你将姓名和工作另存到一个名字叫 报告 的库中以后 你就可以通过联合操作将 报告 与 雇员 通过姓名字段进行联合操作 也就是通知 RDBMS 将 报告 与 雇员 库中姓名与 Becky Boudreaux 相同的记录显示出来 其结果将如下 所示:
在数据库的设计师已经决定了系统的硬件平台和 RDBMS 系统,以后余下事情中最为重要的就是如何来设计数据库的结构了, 数据库的结构将会影响到是后运行于该库上的应 用程序的性能 ,这个决定数据库的分配情况及联合运算的过程称之为标准化。
电脑技术将对今天世办上的商业产生深远的影响, 鼠标只要点一下就可以将数据入库 ,或对其进行访问 ,制造商的国外订货单可以立即接受并执行 ,尽管在20年以前信息的交换, 还需要大型机的支持, 而办公领域处理事务也仍在采用批处理的方式, 要完成某一个查询, 用户需要将需求提交给服务器上的信息管理系统 MIS 给果将会以最快的速度返回给用 户 尽管经常不是足够快。
此外 ,随着关系型数据库模型的发展, 有两种技术被引用到了在今天被称为服务器/客 户机的数据库系统当中 ,第一项技术就是个人电脑 廉价而又易用的应用程序如 Lotus1-2- 3 和 WordPerfect 允许员工 或家庭用户 ,可以建立文档来快速而准确地处理数据, 用户也会经常升级他们的系统以使其速度更快 巧的是这时的系统的价格却在迅速下跌。
第二项技术则是局域网的发展 ,它导致的世界范围内的办公交叉— —虽然用户习惯于 采用终端同主机相连 ,在今天 一个字处理文档可以存储在本地而被任何连接到网络上的电脑访问 ,然后苹果的 Macintosh 电脑为大家提供了一个友好易用的图形用户界面 ,使得电脑变得物美价廉 ,此外, 他们可以访问远程站点 ,并从服务器上下传大量的数据。
在这个飞速发展的时期 一种新型的叫作服务器/客户机的系统诞生了 ,这种系统的处理过程被分解上了客户机和数据服务器上, 新型的应用程序取代了基于主机的应用程序 ,这一体系有着相当多的优点:
l 降低了维护费用
l 减轻的网路负荷 处理过程在服务器上和客户机上均有
l 多个操作系统可以基于相同了网络协议来共同工作
l 本地化的数据操作提高了数据的完整性
客房机/服务器系统就是把单一的任务分解到多个处理器上进行协同处理,就像在单个处理器上运行时一样,一个完备的客户机/服务器系统可以将多个处理器捆绑在一起,以提供一个单一系统虚拟环境 共享的资源可以被位于远端的客户机通过特殊的服务来访问,这种结构可以逐级递归 所以一级服务器可以在最后转变为客户机进需 要求其他的服务器提供服务 就这样一直下去。
这种类型的应用程序在设计时需要全新的程序设计技巧, 今天的用户界面都是图形用户界面,不论是微软的 WINDOWS 苹果的 MACINTOSH IBM 的OS/2 还是 UNIX 的 X- windows系统均是如此, 用过使用 SQL 和网络 应用程序就可以访问位于远端服务器上的 数据库 ,个人电脑处理能力的提高可以对存放在一系统相关的服务器的数据库作出评定, 而这此服务器是可以更换的 ,而应用程序则只需做出较少的改动甚至无需改动。
本书在许多场合下可以借用 BASIC 的概念, 举例来说 Microsoft Access 是基于 windows 的单用房应用程序,而SQL SEVER则可以允许100个用户同时工作 SQL的最大优越性在于它是一种真正的跨平台的交互式语言, 由于它可以被程序员在第四代的编程语言中调用 ,第四代编程语言可以做用少量的代码做大量的工作。
ORACLE公司是第一个发行基本于SQL的关系型数据库管理系统 RDBMS 的公司, 虽然它是为VAX/VMS系统开发的 ,ORACLE公司也是DOS下的关系型数据库的供应商 之一 ,ORACLE现在可以运行在近70种平台之上, 在八十年代中期 Sybase公司发行了他们的 RDBMS — — SQL Sever 具有客户端数据库访问功能并支持过程存储 ,将在第 14 天 的动态应用 SQL 中提到 和多平台交互工作能力 ,SQL Sever 作为一个成功的产品 其客 户机/服务器工作能力是其最为突出的优势所在, 这个强大的数据库系统具有极高的平台适 应性 用C语言写成的运行于PC机的ORACLE其实是运行于VAX系统上的ORACLE的 复制。
SQL 与客户机/服务器应用程序开发环境 ,在使用客户机/服务器电脑来开发客户机/服务器应用程序时 SQL 和关系型数据库的思想遍及始终 在单用户系统中使用这种技术也可以使您的程序更适应未来的发展。
SQL是操作和检索关系型数据库的事实上的标准语言,它允许程序员和数据库管理员做如下的工作:
l 更改数据库的结构
l 更改系统的安全设置
l 增加用户对数据库或表的许可权限 l 在数据库中检索需要的信息
l 对数据库的信息进行更新
注 对于 SQL 大家可能还不明白 S 即 Structured 结构 L 即 Language 语言 ,这是显 而易见的, 但是 Q 的意思容易让人误解 Q 的意思当然是 Query 查询 — —如果你 直译的话, 可是这只限于你对数据库提问 ,但是 SQL 能干的不只是查询 通过它你可 以建立一个库 添加和删除数据 对数据作联合 当数据库改变时触发动作 并把你 的查询存储在程序或数据库中。
不幸得很 这对于查询来说似乎是一个缺点 显然 库结构的增加 删除 修改 联 合 存储 触发以及查询语言在多用户协同工作时有点烦琐 我们将会在工作中一直与 SQL 打交道 不过现在你应该知道它的功能不只是限于它的名字所指的内容了
SELECT 语句是 SQL 中应用最多的语句 见第二章 查询 — — SELECT 语句的使用 它会从数据库中检索需要的数据并把结果返回给用户 上边的雇员表的举例便是一个典型的 SELECT 语句的使用例子 除了 SELECT 语句之外 SQL 还提供了用以建立新的数据库 表格 字段和索引的语句以及记录的插入和删除语句 你将会发现 ANSI SQL 还提供了 对核心数据操作的功能 许多数据库管理系统还提供了确保数据完整性和强制安全性的工 具 见第 11 天的传输控制 它允许程序员在当前环境不符合的时候强制性地终止语句组 的执行
这一部分将介绍一些大众化的 SQL 开发工具 ,每一种工具都有它的优点和缺点 一些 工具是基于 PC 用户的 强调易用性 而另一些则是为超大型数据库提供的 ,本部分将向 您介绍选择这些工具的关键所在。
注 :为了 SQL 在实际中的使用 本书中举出了一些 SQL 在实际开发环境中的应用例 子, SQL只有出现在你的代码中 为你真正地解决了问题才说明它是有用的。
在一些应用实例中我们将会举一些 Microsoft Access 的例子 Microsoft Access 是一个 非常容易使用的基于 PC 机的数据库管理系统 在它的下边你既可以手工输入 SQL 语句也 可以使用图形用户界面工具来生成 SQL 语句
我们使用 Personal Oracle7 来向大家演示 SQL 对大型数据库上的命令行使用方法 当 用户对一个数据库或一个操作系统有充分的了解以后 需要在一个孤立的电脑上进行设计 时这种方法是非常重要的 在命令行下 用户可以在 SQL PLUS 工具中输入不同的单的 SQL 语句 该工具可以把数据返回给用户 或是对数据库进行适当的操作。
大多数例子是针对初用 SQL 进行程序设计的程序员的 我们从最简单的 SQL 语句开 始并进阶到事务处理阶段 为程序设计做好准备 Oracle 的发行版提供一整套的开发工具 它包括 C++和 Visual Basic 函数库(Oracle Objects for OLE) 通过它可以将应用程序与 ORACLE 个人数据库链接在一起 它也可以为数据库 用户或管理员提供图形工具 同 SQL*Loader 一样 它也经常用于从 Oracle 数据库中导出或引入数据。
注 :Personal Oracle7 是 Oracle7 server 的不完整版 它只允许单用户操作 就如同它的名字 一样 但它在SQL的语法使用与大型更昂贵的Oracle版本是相同的此外在Personal Oracle7 中所使用的工具也适用于 Oracle 的其他版本。
我们选择 Personal7 基于以下原因
l 它几乎用到了本书中将要讨论的所有工具
l 它是可以在几乎全部的平台运行的 风靡世界的关系型数据库管理系统
l 可以从Oracle公司的服务器上下载一个它的90天限时版(http://www.oracle.com).
上图显示了 SQL-PLUS 的一个画面
Microsoft Query是Microsoft公司的Visual C++和Visual Basic开发工具包中所附带的 一个非常有用的查询工具 它可应用在基于 ODBC 标准下的数据库 该查询工具在将查询 语句提交给数据库之前会将基保留在驱动器上
ODBC 是为应用程序接口 API 提供的访问下层数据库所 用的函数库 它通过数据库引擎与数据库交流 就像在 Windows 通过打印驱动程序与打印机通信那样 为了访问数据库 可能还 会需要网络驱动程序与异地数据库通信 ODBC 的结构如下图所示:
ODBC 的特色在于它不是针对任何一种数据库的 举例来说 你可以用相同的代码来在 Microsoft Access 表中或 Informix database 上运行查询 而无需修改代码或只需做很小的改动 再 提醒您一次 第三方数据库供应商可能会在 SQL 的标准之上对其 进行扩充 比如 Microsof 和 Sybase 的 Transact-SQL 以及 Oracle 的 PL/SQL
当您用一种新型的数据库工作时您应该认真阅读一下它的文档 ODBC 是许多数据库所支持的一种标准 包括 Visual Basic 、Visual C++、Borland Delphi和PowerBuilder。基于 ODBC 所开发的应用程序有着明显的优势 因为它允许你在编写代码的时候不必考虑 是为哪一个数据库所写的 当然 它的运行速度要弱于特定的数据库代码 也就是说在使 用 ODBC 的时候其灵活性更强但比起使用 Oracle7 或 Sybase 的函数库时要慢
SQL的最初标准是ANSI-1986 而在ANSI-1989中定义的SQL在应用程序中的三种 接口类型:
l 模块语句— —在程序中使用过程 该过程可以通过主调参数向主调函数返回值
l 内嵌 SQL — — 可以在编写程序的过程中内嵌 SQL 语句 该方式在经常需要对 SQL 语句进行预编译处理时所需要 在 Pascal FORTRAN COBOL PL/1 中均定义了这样的子句
l 直接调用— —由程序直接实现
在动态 SQL 发展以前 内嵌 SQL 在编程中应用最为流行 这种方法在今天也仍然在
使用 由于静态的 SQL — — 它的意思就是 SQL 语句已经被编译在了应用程序之中 不能在 运行的过程中改变 这与编译程序同解释程序的区别类似 也就是说这种类型的 SQL 速度 很快 但是灵活性很差 这在今天的商业应用领域是不适宜的 动态 SQL 这里就不多说了
ANSI-92 标准将 SQL 语言标准扩展为一种国际化的标准 它定义了 SQL 的三种编译 级别 登录调用 内嵌子句和完全编译 主要的新特性如下:
l 联接到数据库
l 移动游标
l 动态SQL
l 外连接
除了这些扩展以外还包括了第三方数据库供应商所提供的扩展 动态 SQL 允许你在运行时修改 SQL 语句 但是它的速度要比内嵌型 SQL 慢 它在调用级接口上为应用程 序开发人员提供了相当大的灵活性 ODBC或Sybase的DB-Library就是动态SQL的例子
调用级接口对于编程人员来说不是一个新概念 当您在使用 ODBC 时 举例来说 你 需要在 SQL 语句提交给数据库时修改子句中的变量参数而使用该功能 在设计阶段可以通 过使用其它的函数调用接收错误信息或结果 结果是以数据包的形式返回的。
介绍了 SQL 的历史 由于 SQL 与关系型数据库是紧密结合的 所以第一天也简 要地介绍了关系型数据库的历史和它的功能 明天我们将讲述 SQL 中最为常用的功能 — — 查询
问 :为什么我要了解SQL
答: 到现在为止 如果你不知道如何利用大型数据库来进行工作 如果你要使用客户机/服务器型应用程序开发平台 如 Visual Basic Visual C++ ODBC Delphi 和 PowerBuilder 以及一些已经移植到 PC 平台上的大型数据库系统 如 Oracle 和 Sybase 来进行开发工作 那么你只有学习 SQL 的知识 在今天大多数的商用程序开 发都需要你了解 SQL
问: 在学习SQL时我为什么要了解关系型数据库系统
答: SQL 在为关系型数据库系统开发的 不知道点关系型数据库系统的知识你就无法有效地使用 SQL
问 :在 GUI 图形用户界面工具下我只需按按钮就可以写出 SQL 语句 为什么我还需要学习手工写 SQL
答 :GUI 有 GUI 的方法 手工有手工的方法 一般说来手工写出来的 SQL 比 GUI 写出来的更有效率 GUI 的 SQL 语句没有手工写出的易读 而且如果你知道如何用手工来写SQL 的话那么你在使用 GUI 时就会有更高的效率
问 :既然SQL是一种标准化语言 那是不是说我可以用它在任何数据库下进行编程
答 :不是 ,你只能将它用于支持SQL的关系型数据库系统 如MS-Access Oracle Sybase和Informix 尽管不同的系统在执行时有所差别 但是你只需要对你的 SQL 语句进行 很小的调整
在校练场里我们提出了一些问题以帮助你巩固自己所学 这些练习可以提高你在学习中 的经验 请试着回答和练习附录五 问答与练习 中的内容
答:SQL被认为是一种非过程型语言,因为它不需要详细描述要执行的操作步骤。相反,SQL查询语句仅描述所需的数据和结果。SQL查询语句提供了一个用于访问和管理关系型数据库的标准语言。它允许用户编写声明性查询语句,而不必指定程序的详细执行过程。这意味着数据库系统可以自行决定如何处理查询并生成结果。从程序员的角度来看,SQL不需要指定要执行的操作步骤和过程。因此,SQL被认为是一种非过程型语言。
答:关系型数据库是一种基于关系模型(即表格)的数据库系统。以下是一些关系型数据库的特征,以帮助您判断一个数据库系统是否是关系型数据库:
如果一个数据库系统具备上述特征,则它可以被认为是一种关系型数据库系统。
答:SQL是Structured Query Language的缩写,是一种用于管理和操作关系型数据库的标准语言。您可以使用SQL来完成以下任务:
总的来说,SQL是一种非常强大和灵活的工具,可以帮助您轻松管理和操纵大量的数据。
答:将数据清晰地分成一个个唯一集的过程被称为数据分组。