读书频道 > 数据库 > SQL Server > SQL权威指南(第4版)
概述
2012-11-28 08:30:22     我来说两句 
收藏    我要投稿   

本文所属图书 > SQL权威指南(第4版)

本书为SQL 名著中文版,兼顾技术与实践,全面细致介绍高级技术,致力于打造SQL 编程专家。本书阐释了数据库设计、优化和操作的各方面内容,提供了成为SQL 编程专业人士所需的技术与技巧、针对新旧挑战性难题的...  立即去当当网订购

给我们带来麻烦的往往不是我们完全不知道的事情,而是那些我们自以为了解了,但其实不然的事情。

——阿蒂默斯·沃德(1834—1867),美国作家、 幽默作家

数据库和RDBMS 与那些伴随着COBOL、FORTRAN 、C、BASIC 、PL/I 、Java 等过程语言或面向对象语言一起出现的文件系统截然不同,SQL 语言本身没有I/O 系统,因此我们通常把SQL 解读为n 几乎不能称为语言o(Scarcely Qualifies as a Language)。SQL 依赖于宿主语言,以便从终端用户获取数据或为其返回数据。

编程语言通常都以某一底层模型为基础。如果了解这个模型,就能更好地理解这门语言。例如,FORTRAN 语言建立在代数学理论之上,虽然这并不表明 FORTRAN 语言酷似代数学,但如果你了解代数学,那么对FORTRAN 语言就不会完全陌生,你可以在赋值语言中写出表达式,也可以猜出那些没有见过的库函数所代表的意思。

在大多数其他编程语言中,程序员习惯于对文件进行处理。文件的设计源于纸质表格,这些文件都存储在计算机里并且非常依赖宿主编程语言。FORTRAN 语言很难读取COBOL文件内容,反之亦然。事实上,在相同语言编写的程序之间共享文件也是非常困难的事情。

文件的最基本形式是一组记录,这些记录按照一定的次序记录在文件里,而我们能够通过物理位置引用记录。我们可以打开一个文件,读取第一条记录,之后依次读取后续的记录,直到读完最后一个记录。当读完最后一个记录后再次读取将会返回EOF (End Of File )值。我们可以在这些记录中来回切换,并且一次操作一条记录,这些操作对于其他程序打开的其他文件没有任何影响,只有程序才能修改文件。

SQL 语言的模型是集合数据,而不是物理文件。SQL 语言的n 工作单位o 是整个模式(schema ),而不是单个表格。

我们在学校里学过数学中集合的概念。集合是无序的,集合中的成员都属于同一类型。当我们对集合进行操作时,这些操作一次作用于全部成员。这就意味着,当我要从正整数集合中选择奇数子集时,返回的是所有奇数值组成的一个集合。我并没有一个个地对整数进行扫描,然后将满足条件的奇数组成集合,仅仅是定义了奇数的规则n 如果将整数除以2 时余数为1,那么该数为奇数o,这个规则可用于对任何整数进行奇数判定。集合模型具有很多优点,并行处理只是其中之一。

FORTRAN 并不是一门完美的代数学语言,同样地,SQL 也不是完美的集合语言,后面的内容将展示这一点。但如果对SQL 语言中的某些内容存疑,考虑一下如何在集合中阐述这些内容,也许就能得到正确的答案。

SQL 语言分三部分,即三个子语言:

DDL   ˆ (Data Declaration Language ,数据描述语言);

DML   ˆ (Data Manipulation Language,数据操作语言);

DCL   ˆ (Data Control Language,数据控制语言)。

DDL用于定义数据库的内容,并维护数据完整性。存储在文件中的数据并没有完整性约束、默认值以及关系的概念。与一个老程序员讨论如何使用FORTRAN 语言读取COBOL文件,而且要求无误地获取操作结果,会得到这样的答案:如果一个程序n 乱动o 数据,那么另一个程序就会表现异常。

在DDL语句上花费精力越多,你的RDBMS 就越能更好地工作。DDL和 DML 及DCL语言一起工作;SQL 是一个整体,而不是这三种语言无关联的简单拼凑。

DML是大多数读者执行查询、插入、更新以及删除操作并赖以为生的语言。如果对数据进行了规范化处理,并创建了良好的模式,那么你在工作中将事半功倍。每次编译过程式语言代码时候,操作步骤都是一样的, SQL 语言则不然,每次处理一个查询或其他语句时,执行计划会根据数据库的当前状态而变更。正如柏拉图在《克拉底鲁篇》中所说:n 所有事物都在改变,没有永恒之物o(Everything flows, nothing stands still )。

DCL不是数据安全相关的语言,而是一门关于访问控制的语言。DCL语言并不加密数据;SQL 标准中没有提及数据加密,不过各个厂商为用户提供了一些可选方案。大多数SQL 书籍并不会强调DCL语言,我也不打算在此花费太多篇幅。

有必要为DCL语言单独写一本微型书,它就好像是三脚凳中容易被忽视的那根支撑脚。也许以后我会写一本这样的书。

现在让我们看一些基本概念。如果你对传统文件系统中数据处理的过程已经有所了解,那首先应该抛弃文件处理中的一些认识。

(1)数据库模式不是文件集合。各个文件之间不具有任何关系,应用程序负责处理文件之间的关系。SQL 标准没有提及任何与物理存储相关的问题,而文件建立于连续的物理存储之上。文件系统的出现伴随着打孔卡的产生,而磁带模拟出了文件系统,之后便是早期的文件系统。因为文件系统是所有问题的根源,所以我把它列入了第一条。

(2)数据表不是文件。表是模式的一部分,而模式是一个工作单元,不能在同一个模式下存在多个同名表。文件系统负责为加载到某一物理驱动器上的文件分配名称,而数据库中的表也有表名。文件本身是真实存在的,而表却可以是虚拟的(视图、通用表表达式,查询结果等)。

(3)行不是记录。记录的意义由读取它们的应用程序决定。记录是有先后次序的,所以可以对记录执行第一个、最后一个、下一个、前一个等操作;而行并没有物理顺序(ORDER BY 语句是游标的子句)。记录通过指针以及记录号指向其物理位置。行则通过关系键进行定位,关系键的概念建立在数据模型中属性子集唯一的基础之上。标准中并没有规定这一机制,因此在各个SQL 版本中有很大差异。

(4)列不是字段。字段的意义是由读取字段的应用所决定的。对于不同的应用而言,字段可能具有不同的含义。记录中依次排列着各个字段,字段本身不具有数据类型、约束以及默认值。这就是主动数据与被动数据之间的对比!除此之外,列是可以为空的,而字段没有这样的概念。字段必须是客观存在的,而列可以是计算出来的或虚拟的。如果想有一个计算出来的列值,便可以通过应用程序进行计算,文件并不负责计算。

另一个概念上的区别在于文件常常是整个业务流程的相关数据。文件自身必须包含足够的数据以辅助应用程序进行业务逻辑处理。文件往往都是混合数据,这些数据可以使用业务流程中的业务名称进行描述,例如,n 工资表o 或其他类似的名称。表可以是业务流程中的实体或关系。这意味着一个文件中的数据通常都会放置到多个表中。表倾向于存储可以用一个单词描述出来的纯数据,工资单可以通过员工打卡表、员工表、项目表等多个数据表进行描述。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:宣传语
下一篇:1.1 实体表
相关文章
图文推荐
3.8 实训项目
3.6 实现数据完整性
3.5.5 外键约束
3.5.3 检查约束
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站