给我们带来麻烦的往往不是我们完全不知道的事情,而是那些我们自以为了解了,但其实不然的事情。
———阿蒂默斯·沃德(1834—1867),美国作家、幽默作家
数据库和 RDBMS 与那些伴随着 COBOL、FORTRAN、C、BASIC、PL/I、Java 等过程语言或面向对象语言一起出现的文件系统截然不同,SOL 语言本身没有 I/O 系统,因此我们通常把 SQL 解读为"几乎不能称为语言"(Scarcely Qualifies as a Language)。SQL 依赖于宿主语言,以便从终端用户获取数据或为其返回数据。
编程语言通常都以某一底层模型为基础。如果了解这个模型,就能更好地理解这门语言。例如,FORTRAN 语言建立在代数学理论之上,虽然这并不表明 FORTRAN 语言酷似代数学,但如果你了解代数学,那么对 FORTRAN 语言就不会完全陌生,你可以在赋值语言中写出表达式,也可以猜出那些没有见过的库函数所代表的意思。
在大多数其他编程语言中,程序员习惯于对文件进行处理。文件的设计源于纸质表格,这些文件都存储在计算机里并且非常依赖宿主编程语言。
FORTRAN 语言很难读取 COBOL 文件内容,反之亦然。事实上,在相同语言编写的程序之间共享文件也是非常困难的事情。
文件的最基本形式是一组记录,这些记录按照一定的次序记录在文件里,而我们能够通过物理位置引用记录。我们可以打开一个文件,读取第一条记录,之后依次读取后续的记录,直到读完最后一个记录。当读完最后一个记录后再次读取将会返回 EOF(End Of File)值。我们可以在这些记录中来回切换,并且一次操作一条记录,这些操作对于其他程序打开的其他文件没有任何影响,只有程序才能修改文件。
SQL 语言的模型是集合数据,而不是物理文件。SQL 语言的"工作单位"是整个模式(schema),而不是单个表格。
我们在学校里学过数学中集合的概念。集合是无序的,集合中的成员都属于同一类型。当我们对集合进行操作时,这些操作一次作用于全部成员。这就意味着,当我要从正整数集合中选择奇数子集时,返回的是所有奇数值组成的一个集合。我并没有一个个地对整数进行扫描,然后将满足条件的奇数组成集合,仅仅是定义了奇数的规则"如果将整数除以 2 时余数为1,那么该数为奇数",这个规则可用于对任何整数进行奇数判定。集合模型具有很多优点,并行处理只是其中之一。
FORTRAN 并不是一门完美的代数学语言,同样地,SOL 也不是完美的集合语言,后面的内容将展示这一点。但如果对 SQL 语言中的某些内容存疑,考虑一下如何在集合中阐述这些内容,也许就能得到正确的答案。
SQL语言分三部分,即三个子语言∶
口 DDL(Data Declaration Language,数据描述语言);
口DML (Data Manipulation Language,数据操作语言);
口 DCL (Data Control Language,数据控制语言)。
DDL 用于定义数据库的内容,并维护数据完整性。存储在文件中的数据并没有完整性约束、默认值以及关系的概念。与一个老程序员讨论如何使用 FORTRAN 语言读取 COBOL 文件,而且要求无误地获取操作结果,会得到这样的答案∶如果一个程序"乱动"数据,那么另一个程序就会表现异常。
在 DDL 语句上花费精力越多,你的 RDBMS 就越能更好地工作。DDL 和 DML 及 DCL 语言一起工作; SQL 是一个整体,而不是这三种语言无关联的简单拼凑。
DML 是大多数读者执行查询、插入、更新以及删除操作并赖以为生的语言。如果对数据进行了规范化处理,并创建了良好的模式,那么你在工作中将事半功倍。每次编译过程式语言代码时候,操作步骤都是一样的,SOL 语言则不然,每次处理一个查询或其他语句时,执行计划会根据数据库的当前状态而变更。正如柏拉图在《克拉底鲁篇》中所说∶"所有事物都在改变,没有永恒之物"(Everything flows, nothing stands still)。
DCL 不是数据安全相关的语言,而是一门关于访问控制的语言。DCL 语言并不加密数据 SQL 标准中没有提及数据加密,不过各个厂商为用户提供了一些可选方案。大多数 SOL 书籍并不会强调 DCL 语言,我也不打算在此花费太多篇幅。
有必要为 DCL 语言单独写一本微型书,它就好像是三脚凳中容易被忽视的那根支撑脚。也许以后我会写一本这样的书。
现在让我们看一些基本概念。如果你对传统文件系统中数据处理的过程已经有所了解,那首先应该抛弃文件处理中的一些认识。
(1)数据库模式不是文件集合。各个文件之间不具有任何关系,应用程序负责处理文件之间的关系。SQL 标准没有提及任何与物理存储相关的问题,而文件建立于连续的物理存储之上。文件系统的出现伴随着打孔卡的产生,而磁带模拟出了文件系统,之后便是早期的文件系统。因为文件系统是所有问题的根源,所以我把它列入了第一条。
(2)数据表不是文件。表是模式的一部分,而模式是一个工作单元,不能在同一个模式下存在多个同名表。 文件系统负责为加载到某一物理驱动器上的文件分配名称,而数据库中的表也有表名。文件本身是真实存在的,而表却可以是虚拟的(视图、通用表表达式,查询结果等)。
(3)行不是记录。记录的意义由读取它们的应用程序决定。记录是有先后次序的,所以可以对记录执行第一个、最后一个、下一个、前一个等操作; 而行并没有物理顺序(ORDER BY 语句是游标的子句)。记录通过指针以及记录号指向其物理位置。行则通过关系键进行定位,关系键的概念建立在数据模型中属性子集唯一的基础之上。标准中并没有规定这一机制,因此在各个SQL 版本中有很大差异。
(4)列不是字段。字段的意 义是由读取字段的应用所决定的1。对干不同的应用而言。字段可能具有不同的含义。记录中依次排列着各个字段,字段本身不具有数据类型、约束以及默认值。这就是主动数据与被动数据之间的对比!除此之外,列是可以为空的,而字段没有这样的概念。字段必须是客观存在的,而列可以是计算出来的或虚拟的。如果想有一个计算出来的列值,便可以通过应用程序进行计算,文件并不负责计算。
另一个概念上的区别在于文件常常是整个业务流程的相关数据。文件自身必须包含足够的数据以辅助应用程序进行业务逻辑处理。文件往往都是混合数据,这些数据可以使用业务流程中的业务名称进行描述,例如,"工资表"或其他类似的名称。表可以是业务流程中的实体或关系。这意味着一个文件中的数据通常都会放置到多个表中。表倾向于存储可以用一个单词描述出来的纯数据,工资单可以通过员工打卡表、员工表、项目表等多个数据表进行描述。
1.1 实体表
实体是物理或逻辑上具有某一含义的事物。一个人、一笔买卖或一件货物都是实体。在关系型数据库中,实体由它的属性定义。实体以表中行的形式体现,数据行中的每一列代表了实体的一个属性。属性的值是一个标量值。
为了提醒用户表是实体的集合,我倾向于使用描述实体功能的集合名词或复数名词定义系统中相关的表名。因此,"Employee"不是一个好的表名,因为这是单数形式,而复数形式的"Employees"更好些。"Personnel"最适合用作表名,因为它具有集合性,同时也不会被误以为是各自无关个人的集合。这个名字同时也符合 ISO 11179 标准对元数据的要求。我的另外一本书《SOL 编程风格》中详细描述了这些标准。
如果多个表具有完全相同的结构,那么这些表是同一类元素的集合。但应该将同一类的数据元素归入到一个集合中!反之,文件是物理上独立的存储单元,这些文件可能非常相似∶ 每个磁带/磁盘文件都代表了处理过程的一个步骤,如获取原始数据、编辑数据、最后将数据存档。而在 SQL 中,这些应该是表中的一个状态标志。
1.2 关系表
在 SOL 中,将表中的列指向一个或多个实体表,可以表现关联关系。
脱离了实体,关系就没有意义,不过关系可以包含自身的属性。举例来说,一个演艺合同可能会涉及经纪人、雇主、演出人员。付款方式是合同本身的属性,而不是这三方的属性,这表明有一列必须引用其他表。文件和字段无法做到这点。
1.3 行与记录
行不同于记录。应用程序中定义并使用记录。而行则不然,行由数据库模式定义,而不是应用程序。应用程序中的读写语句将用到字段的名称。数据库模式为行进行命名。同样地,读取字段的物理顺序至关重要。读取 a、b、c 字段与读取c、a、b字段得到的内容是不同的,但在数据库中选择(select)a、b、c 与选择 c、a、b获得的数据是完全一致的。
所有的空文件都很相似,它们都是操作系统中具有名称的目录项,这些空文件存储了 0 B的内容。与它们相比,空表虽然没有数据行,但依然包含列、约束、安全权限以及其他结构。
集合理论中空集是一个完全有效的集合,SOL 中这一点与集合理论一致。SOL 的集合模型与标准数学中的集合理论的差异之处在于,集合理论中只有一个空集合,而在 SOL集合模型中,由于每个表都具有不同的数据结构,因此如果某处不能使用集合的非空版本,那么该集合的空集一定也不适用。
同一表中的行还具有以下特点∶这些行的数据结构完全相同,在模型中它们表示"同一类事物"。在文件系统中,记录在长短、数据类型以及结构上都有所不同,而数据流中的标志将告知应用程序如何解析数据。最常见的例子包括 Pascal 中的变体记录(variant record),C语言的 struct 语法以及 COBOL 的 OCCuRS 子句。
COBOL 语言中的 OCCURS关键字以及 Pascal 语言中的 VARIANT 记录都包含了一个数值,通过该数值告诉在程序当前的记录中,子记录结构的重复次数。
C语言中的联合体(union)虽然不是变体记录,但却可以基于相同的物理内存进行变体映射。例如∶
union x { int ival; char j[4];}mystuff;
该语句定义了mystuff联合体,该联合体既可以是整型(在大多数 C编译器中是 4字节,不过这段代码是不可移植的),也可以是 4字节的数组,这取决于是通过 mystuff.ival 还是 mystuff. j【0】调用它。
比这更重要的差异是,文件通常都包含有汇总其他记录子集统计信息的记录,这也称为控制小计报表(control break report)。没有规定明确同一个文件中的记录需要以什么方式关联起来,文件只是包含二进制数据的数据流,读取文件的程序负责解释文件内容。
1.4 列与字段
记录中字段的含义由读取该字段的应用程序定义,而表中数据行的某一列的含义是由数据库模式定义的。列的数据类型总是标量。
在 READ和 INPUT 语句中,程序将依照应用程序变量在语句中的顺序读取这些变量,因此变量的顺序非常重要。在 SQL 语言中,只能通过列名来引用列。虽然 SELECT *语句和 INSERT INTo <表名> 等语句中使用了会扩展成列名列表的缩写,这些扩展后的列名顺序与表定义中列名的顺序相同,不过这些缩写也仅仅是解析成命名列表的缩写而已。
SQL 语言中 NULL 值的作用不同于其他语言。字段中并不支持可作为字段、记录或文件本身一部分的"丢失数据标记"。除此之外,不能像 SOL 的 DEFAULT 和 CHECK()语句那样为记录的字段添加约束。
文件本身是非常被动的,它会毫不反对地接受应用程序丢给它的所有内容。与此同时,文件之间毫无关联,而这只是因为它们每次只与一个应用程序联系,所以并不知道其他文件是什么样子。
【下载地址】
链接:https://pan.baidu.com/s/1yJOJaiQCmrVEsL_rqt3bGw
提取码:vl2b
相关文章
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
数据库原理应用与实践(SQLServer)(高清PDF 下载)
本书围绕数据库的原理、应用和实施,系统、全面地介绍数据库的基本概念、方法和核心技术。全书分三部分进行阐述,第一部分侧重数据库理论基础,内容包
首先教你 SQL 整体优化、快速优化实施、如何读懂执行计划、如何左右执行计划这四大必杀招。整这些干嘛呢?答案是,传授一个先整体后局部的宏观解
本书全面探讨了SQL Server 2008 的内部工作原理。全书共分为 11章,首先在第 1 章中详细介绍了 SQL Server 200
SQL 语言的模型是集合数据,而不是物理文件。SQL 语言的"工作单位"是整个模式(schema),而不是单个表格。
编写本书的目的在于架起两座桥梁∶一是让数据库工程师从初级向中级进阶的桥梁,旨在帮助初级工程师提升自己;二是理论(原理)和实践之间的桥梁。
本书是畅销书《SOL基础教程》的第2版,介绍了关系数据库以及用来操作关系数据库的SOL语言的使用方法。书中通过丰富的图示、大量示例程序和详实
SQL是使用最广泛的数据库语言,几乎所有重要的 DBMS 都支持 SOL。本书由浅入深地讲解了 SQL 的基本概念和语法,涉及数据的排序、过
本书从介绍简单的数据检索开始,全面讲述了 SOL Server 的使用,包括连接的使用、子查询、基于全文本的搜索、函数和存储过程、游标、触发
SQL Server2016从入门到实战(高清PDF 下载)
SQLServer 数据库是 Microsof 公司推出的数据库管理系统,2016 版本在性能和人机交互等方面均有显著损高。本书是一本帮助用
SQLServer2014管理最佳实践第3版(高清PDF 下载)
SQL Server 2014 不只打破了原来由 Oracle/SPARC持有的纪录,而且在这两种配置下,表现得都优于Oracle。
本书从数据库的基础知识入手,全面介绍 SQL Server 2008 数据库应用知识。
SQL SERVER-2008从入门到精通(高清PDF下载)
本书注重理论与实践,在7大部分 26 章的篇幅中,按照一个知识点一个练习的方式,循序渐进、由浅入深地介绍SOL Server 2008 的核
它是在对 SQL Server 7.0版本重新设计的基础上建立的———提供了单独的日期和时间数据类型,以及地理空间支持。本书着重解决各层次开
PostgreSQL 是一个采取 相同的开 源理念的 优 秀的数据库系统 。这本书整体介绍数据库,全面覆盖现代的关系数据库的能以及怎么高效使
FlashFXP绿色版网盘下载,附激活教程 1839
FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具
Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1607
firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ
navicat for mysql中文绿色版网盘下载 1652
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
火车头采集器(旗舰版)绿色版网盘下载 1737
火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA
Photoshop(CS-2015-2023)绿色中文版软件下载 1858
安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64