作者:empty 页数:312 出版社:empty |
本章介绍数据库的入门知识,首先介绍什么是数据库,然后介绍数据库中的些基本概在计算机系统在各个行业开始普遍应用以后,计算机专家也遇到了同样的问题,因此他前面我们讲到数据库就是“数据的仓库”,我们还需要一套系统来帮助我们管理这些数数据库管理系统是一种操纵和管理数据库的系统软件,是用于建立、使用和维护数据库。念, 接着介绍操纵数据库的不同方式, 最后介绍掉纵数据库时使用的语言SQL, 在章节中我们还将穿插一些非常有趣的话题,
1.1数据库概述广义上来讲,数据库就是“数据的仓库”计算机系统经常用来处理各种各样大量的数据,比如使用计算机系统收集个地区的人信息、检索符合某些条件的当地人信息、当一个人去世后还要从系统中删除此人的相关信息.我们可以自定义一个文件格式,然后把人数据按照这个格式保存到文件中,当需要对己经存入的数据进行检索或者修改的时候就重新读取这个文件然后进行相关操作.这种数据处理方式存在很多问题,比如需要开发人员熟悉操作磁盘文件的数、开发人员必须编写复杂的搜寻算法才能快速的把数据从文件中检索出来、当数据格式发生变化的时候要编写复杂的文件格式升级程序、很难控制并发修改。们提出了数据库理论, 从而大大简化了开发信息系统的难度。数据库理论的鼻祖是CharlesW.Bachman, 他也因此获得了1973年的图灵奖.IBM的Ted Codd则首先提出了关系数据库理论, 并在IBM研究机构开发原型, 这个项目就是R系统, 并且使用SQL做为存取数据表的语言, R系统对后来的Oracle、Ingres和DB 2等关系型数据库系统都产生了非常重要的影响。1.1.1“数据库”与“数据库管理系统”据,比如帮助我们查询到我们需要的数据、帮我们将过时的数据删除,这样的系统我们称之为数据库管理系统(Database Management System, DBMS) 。有时候很多人也将DBMS简称为“数据库”,但是一定要区分“数据库”的这两个不同的意思,它对数据库进行绕一的管理和控制, 以保证数据库的安全性和完整性.用户通过DBMS访
问数据库中的数据, 数据库管理员也通过DBMS进行数据库的维护工作, 它提供多种功能,可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。它使用户能方便地定义和操纵数据,维护数据的安全性和完整性,以及进行多用户下的并发控制和恢复数据库。通俗的说, DBMS就是数据库的大管家, 需要维护什么数据、查找什么数据的话找它告诉他了,它会帮你办的T净利落。1.1.2数据库能做什么要对数据进行增制改查的时候数据库能非常快速的完成所要求的操作;同时数据库隐藏了数据的组织形式,我们只要对数据的属性进行描述就可以了,当我们要对数据库中的数据进行操作的时候只要告诉“做什么”(What to do) 就可以了, DBMS会决定一个比较好的完成操作的方式, 也就是我们无需关心“怎么做”(Howto do) , 这样我们就能从数据存储的底层中脱身出来,把更多精力投入到业务系统的开发中。数据库允许我们指定非常复杂的数据过滤机制,这样无论业务规则多么复杂,我们都能轻松应对:数据库可以处理多用户井发修改问题:数据库提供了操作的事务性机制,这样可以保数据库能够帮助你储存、组织和检索数据,数据库以一定的逻辑方式组织数据,当我们数据库允许我们创建规则,以确保在增加、史新以及除数据的时候保证数据的一致性;证业务数据的万无失。
1.1.3主流数据库管理系统介绍
Informix、MySQL等, 它们在数据库市场上各白古有一席之地.下面简要介绍几种常用的日前有许多DBMS产品, 如DB 2、Oracle、Microsoft SQLServer、Sybase SQLServer、数据库管理系统(1)DB2DB 2第一种使用使用SQL的数据库产品。DB 2于1982年首次发布, 现在已经可以用在许多操作系统平台上,它除了可以运行在OS/390和VM等大型机操作系统以及中等规模的AS/400系统之外, IBM还提供了跨平台(包括基于UNIX的LINUX.HP-UX, Sun Solaris,以及SCO UnixWare:还有用丁个人电脑的Windows 2000系统》的DB 2产品。应用程序可以通过使用微软的ODBC接、Java的JDBC接或者CORBA接代理来访向DB 2数据库。DB 2有不同的版本, 比如DB2 Everyplace是为移动用户提供的一个内存占用小且性能出色的版本:DB2forz/OS则是为主机系统提供的版本; Enterprise Server Edition(ESE) 是一种适用于中型和大型企业的版本:Workgroup Server Edition(WSE) 主要适用丁小型和中型企业, 它提供除大型机连接之外的所有ESE特性; 而DB2 Express则是为开发人员提供的可以免费使用的版本。IBM是最早进行关系数据库理论研究和产品开发的公司, 在关系数据库理论方面一直走在业界的前列,所以DB2的功能和性能都是非常优秀的,不过对开发人员的要求也比其他数据库系统更高, 使用不当很容易造成宕机、死锁等问题:DB 2在SQL的扩展方面比较保守, 很多其他数据库系统支持的SQL扩展特性在DB 2上都无法使用:同时DB 2对数据的类型要求也非常严格,在数据类型不匹配的时候会报错而不是进行类型转换,而且如果发生精度澄出、数据超长等问题的时候也会直接报错,这虽然保证了数据的正确性,但是也使得基于DB2的开发更加麻烦。因此,很多开发人员称DB2为“最难用的数据库系统”(2) OracleOracle是和DB 2同时期发展起来的数据库产品, 也是第二个采用SQL的数据库产品。Oracle从DB 2等产品中吸取到了很多优点, 同时又避免了IBM的官僚体制与过度学术化,大胆的引进了许多新的理论与特性, 所以Oracle无论是功能、性能还是可用性都是非常好的.(3) Microsoft SQLServer面提到了另外一个名字非常相似的Sybase SQLServer, 这里的名字相似并不是一种巧合, 这还要从Mie rosoft SQLServer的发展史谈起。疾而终,但是微软就很快的推出了白己的新代视窗操作系统:而当微软发现数据库系统这块新的市场的时候, 微软没有自己重头开发一个数据库系统, 而是找到了Sybase来“合作”开发基于OS/2的数据产品, 当然微软达到日的以后就立即停止和Sybase的合作了, 于1995年推出了自己的Microsoft SQLServer 6.0, 经过几年的发展终于在1998年推出了轰动一时的Microsoft SQLServer 7.0, 也正是这一个版本使得微软在数据库产品领域有了一席之地。正因为这段“合作”历史, 所以使得Microsoft SQLServer和Sybase SQLServer在很多地方非常类似, 比如底层采用的TDS协议、支持的语法扩展、函数等等。Server的市场地位, 由于Windows操作系统在个人计算机领域的普及, Microsoft SQLServer理所当然的成为了很多数据库开发人员的接触的第一个而且有可能也是唯一一个数据库产品, 很多人甚至在“SQLServer”和“数据库”之间划上了等号, 而且用“SQL”次来专指Microsoft SQLServer, 可见微软的市场普及做的还是非常好的.做足足够的市场以后,微软在2005年“审时度势”的推出了Microsoft SQLServer 2005, 井将于2008年发布新一代的Microsoft SQLServer 2008.库进行管理, 用户甚至无需直接执行任何SQL语句就可以完成数据库的创建、数据表的创建、数据的备份/恢复等工作:Microsoft SQLServer的开发者社区也是非常庞人的, 因此有众多可以参考的学习资料,学习成本非常低,这是其他数据库产品做不具有的优势:同时从Microsoft SQLServer 2005开始开发人员可以使用任何支持.Net的语言来编写存储过程, 这进一步降低了Microsoft SQLServer的使用门權。行于Windows操作系统, 因此我们无法在Linux、Unix上运行它:不管微软给出什么样的测试数据, 在实际使用中Microsoft SQLServer在大数据量和大交易量的环境中的表现都是不尽人意的, 当企业的业务量到达一个水平后就要考虑升级到Oracle或者DB 2了.Microsoft SQLServer是微软推出的一款数据库产品。细心的读者也许已经发现我们前微软当初要进军图形化操作系统, 所以就开始和IBM“合作”开发OS/2, 最终当然无微软在2000年推出了Microsoft SQLServer 2000, 这个版本继续稳固了Microsoft SQLMicrosoft SQLServer的可用性做的非常好, 提供了很多了外围工具来帮助用户对数据不过正如微软产品的一贯风格, Microsoft SQLServer的劣势也是非常明显的; 只能运(4) MySQLMySQL是一个小型关系型数据库管理系统, 开发者为瑞典MySQL AB公司, 目前MySQL被广泛地应用在中小型系统中, 特别是在网络应用中用户群更多。MySQL没有提供一些中小型系统中很少使用的功能, 所以MySQL的资源古用非常小, 更加易于安装、使用和管理。由于MySQL是开源的, 所以在PHP和Java开发人员心中更是首选的数据库开发搭档,日前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP) , 即使用Linux作为操作系统, Apache作为Web服务器, MySQL作为数据库, PHP作为服务器端脚本解释器。MySQL目前还很难用于支撑大业务量的系统, 所以目前MySQL大部分还是用来运行非核心业务:同时巾于MySQL在国内没有足够的技术支持力量, 所以对MySQL的技术支持工作是由IS V或者系统集成商来承担, 这也导致部分客户对MySQL比较抵制, 他们更倾向于使用有更强技术支持力量的数据库产品1.2数据库基础概念要想使用数据库, 我们必须熟悉一些基本概念, 这些概念包括:Catalog、表、列、数
据类型、记录、土键以及表关联等等。1.2.1 Catalog数据库就是数据的仓库, 而DBMS是数据库的“管理员”, 一些企业即生产食品又生产不便于管理,食品的保存和复印纸的保存需要的保存条件是不同的,食品需要低温保鲜而复印纸则需要除湿,不同类的物品放在一起加人了管理的难度:了防止受潮,也要把它们摆放到高处:办公用胶片也要避免阳光直射,所以同样要摆放到背阴面,而且胶片也要防潮,所以同样要把它们摆放到高处,这就造两种货物占据的货位相冲突了,品的人员可能会顺手牵羊将食品愉价带出仓库。不便于管理,为了防止数据丢失,企业需要对数据进行定期备份,不过和核心业务数据比起米人力资源数据的重要性要稍差,所以人力资源数据只要一个月备份一次就可以了,而核心业务数据则需要每天都备份。如果将这两种数据保存在一个数据库中会给备份工作带来麻烦:可能会造成命名冲突, 比如人力资源数据中需要将保存员工数据的表命名为Persons,而核心业务数据也要将保存客户数据的表也命名为Persons, 这就会相冲突了。会有数据安全问题。由于所有的数据都保存在一个数据库中,这样人力资源系统的用户也可以访问核心业务系统中的数据,很容易造成数据安全问题.显而易见,对于上边提到的多种物品保存在一个仓库中的问题,最好的解决策略就是使不同的磁盘上,由于人力资源数据相对次要一些,因此我们可以将HR保存在普通硬盘上, 面将BIZ保存在RAID便盘上。我们还可以对每个Catalog所能占据的最大磁盘空间、日志大小甚至优先级进行指定,这样就可以针对不同的业务数据进行个性化定制了。避免了命名冲突, 同一个Catalog中的表名是不允许重复的, 而不同Catalog中的表名结构可以完全不和同,保存的数据也不会互和干扰.的Catalog.比如用户hr 123只能访问HR, 而用户sales 001只能访问BIZ。这就大大加强了系统数据的安全性。虽然我们已经将不同用途的物品保存在不同的仓库中了,但是在同一个仓库中数据的保同样是生肉,不同的生肉又有不同的特性,有的生肉是里脊肉,有的生肉是前臀尖,这不仅如此,标签的格式也要统一,如果第一块生肉的标签内容是:采用这种标签由于没有统一的格式,所以阅读起米非常麻烦,要靠人工去分辨,错误率这样每块肉的标签就可以按照这个格式来填写了;在数据库的表中保存的数据也有类似问题,如果不规定格式的话,表中的数据也会非常农用物资,这些产品都要保存到仓库中,同时企业内部也有一些办公用品需要保存到仓库中,如果这些物品都保存到同一个仓库中的话会造成下面的问题:可能会造成货位冲突,食品要防止阳光真射造成的变质,因此要摆放到背阴面,同时为会有安全问题。由于所有物品都放到一个仓库中没有进行隔离,所以来仓库领取办公用既然都是“仓库”,那么数据库系统也存在类似问题,如果企业将人力资源数据和核心业务数据都保存到个数据库中同样会造成下面的问题:用多个仓库,食品保存在食品仓库中,农用物资保存在农用物资仓库中,而办公用品则保存在办公用品仓库中, 这样就可以解决问题了, 问了解决同样的问题, DBMS也采用了多数据库的方式来保存不同类别的数据, 一个DBMS可以管理多个数据库, 我们将人力资源数据保存在HR数据库中, 而将核心业务数据保存在BIZ数据库中, 我们将这些不同数据库叫做Catalog(在有的DBMS中也称为Database, 即数据库) 。采用多Catalog以后可以给我们带来如下好处:便于对各个Catalog进行个性化管理。DBMS都允许我们指定将不同的Caa log保存在则是可以重复的, 这样HR中可以有Persons表, 而BIZ中也可以有Persons表, 者安全性更高, DBMS允许为不同的Catalog指定不同的用户, 并且可以限定用户能访问1.2.2表(Table)存仍然存在问题,比如食品分为熟食、生肉、大米等,如果把他们随意的堆放在起,就会造成我们无法很容易的对这些食品进行管理,当要对人米进行提货的话就必须在一堆的食品中翻米翻去,解决这个问题的方法就是将仓库划分为不同的l域,熟食保存在熟食区,生肉保存在生肉区,而大米则保存在大米区.DBMS中也存在类似的问题, 虽然我们将核心业务数据保存在BIZ数据库中了, 但是核心业务数据也有很多不同类型的数据,比如客户资料、商品资料、销售员资料等,如果将这些数据混杂在一起的话将会管理起来非常麻烦,比如我们要查询所有客户资料的话就必须将所有数据查询一通。解决这个问题的方法就是将不同类型的资料放到不同的“区域”中,我们将这种区域叫做“表”(Table) .客户资料保存到Customers表中, 将商品资料保存在Goods表中, 而将销售员资料保存在SalesMen表中, 这样当需要查找商品的时候只要到Goods表中查找就可以了。1.2.3列(Column)块生肉是18公斤,而那块生肉是12公斤,这块生肉是12.2元/公斤,而那块生肉是13.6元/公斤。每块肉都有各自的不同的特性,这些特性包括取肉部位、重量、单价,如果不对每块肉标注这些特性数据的话,当提货人要我们将所有里脊肉出库的话我们就非常麻烦了,解决这个问题的万法就是制作一些标签,在这个标签上标明取肉部位、重量、单价,这样要提取货物就会非常方便了。另块生肉的标签内容是非常高,如果我们规定一个统一的标签格式,比如下面的标签:这种格式阅读起来非常方便,如果引入自动识别设备的话。甚至可以实现自动化的物品分拣。
第1章数据库入门1
1.1数据库概述1
1.1.1数据库与数据库管理系统
1.1.2数据库能做什么2
1.1.3主流数据库管理系统介绍2
1.2数据库基础概念5
1.21Catalogs
1.2.2表(Table)6
1.2.3
列(Column)7
1.2.4数据类型(DataType)8
1.2.5记录(Record) 9
1.2.6王键(PrimaryKey) 9
1.2.7索引(Index)10.
1.2.8
表关联12
1.2.9数据库的语言——SQL13
1.2.10DBA与程序员14
第2章数据表的创建和管理17
2.1
数据类型17
2.1.1整数类型17
2.1.2
数值类型19
2.1.3字符相关类型21
2.1.4
日期时间类型23
2.1.5二进制类型24
2.2通过SQL语句管理数据表25
2.2.1创建数据表25
2.2.2定义非空约束26
2.2.3定义默认值27
2.2.4定义主键27
2.2.5定义外键29
2.2.6修改已有数据表30
2.2.7
除数据表31
2.2.8受限操作的变通解决方案31
第3章数据的增、、改33
3.1
数据的插入34
3.1.1简单的INSERT语句34
3.1.2简化的INSERT语句36
3.1.3非空约束对数据插入的影响36
3.1.4主键对数据插入的影响37
3.1.5外键对数据插入的影响38
3.2数据的更新38
3.2.1简单的数据更新39
3.2.2
带WHERE子句的UPDATE语句40
3.2.3非空约束对数据更新的影响41
3.2.4主键对数据更新的影响42
3.2.5外键对数据更新的影响42
3.3数据的删除43
3.3.1简单的数据删除43
3.3.2带WHERE子句的DELETE语句44
第4章数据的检索47
简单的数据检索
4.1.2检索出需要的列
列别名51
4.1.4按条件过滤52
4.1.5数据汇总53
4.1.6排序56
4.2高级数据过滤59
4.2.1通配符过滤59
4.2.2空值检测63
4.2.3反义运算符64
4.2.4多值检测65
4.2.5范国值检测66
4.2.6低效的“WHERE 1-1”68
4.3数据分组72
4.3.1数据分组入门74
4.3.2数据分组与聚合函数76
4.3.3 HAVING语句79
4.4限制结果集行数81
4.4.2MSSQL Server 200082
4.4.3MSSQL Server 200583
444 Oracle 84
4.4.5DB286
4.4.6数据库分页88
4.5抑制数据重复90
4.6计算字段91
4.6.1常量字段92
4.6.2字段间的计算93
4.6.3数据处理函数95
4.6.4字符中的拼接97
4.6.5计算字段的其他用途103
4.7
不从实体表中取的数据105
4.8联合结果集107
4.8.1简单的结果集联合108
4.8.2
联合结果集的原则110
4.8.3 UNION ALL112
4.8.4联合结果集应用举例114
第5章函数119
5.1数学函数122
5.11求绝对值122
5.1.3求平方根123
5.1.4求随机数123
5.1.5舍入到最大整数125
5.1.6舍入到最小整数126
5.1.7四舍五入127
5.1.8求正弦值128
5.1.9求余弦值129
5.1.10求反正弦值129
5.1.11求反余弦值130
5.1.12求正切值130
5.1.13求反正切值131
5.1.14求两个变量的反正切131
5.1.15求余切132
5.1.16求圆周率x值132
5.1.17弧度制转换为角度制133
5.1.18角度制转换为弧度制134
5.1.19求符号134
5.120求整除余数135
5.1.21求自然对数136
5.1.22求以10为底的对数136
5.1.23求幂137
5.2字符中函数137
5.2.1计算字符串长度138
5.2.2字符申转换为小写138
5.2.3字符串转换为人写139
5.2.4截去字符串左侧空格139
5.2.5截去字符中右侧空格140
5.2.6截去字符中两侧的空格141
取子字符143
5.2.8计算子字符串的位置144
5.2.9从左侧开始取了字符申145
5.2.10从右侧开始取子字符串146
5.2.11字符斗替换147
5.2.12得到字符的A SCI码148
5.2.13得到一个A SCI码数字对应的字符
5.2.14发音匹配度151
日期时间函数153
5.3.1日期、时间、日期时间与时间截153
5.3.5计算日期差额166
5.3.6计算一个日期是星期儿172
5.3.7取得日期的指定部分177
5.4其他函数183
5.4.2空值处理188
斗流数据库系统中日期时间类型的表示方式
取得当前口期时间154
日期增减157
类型转换183
5.4.3 CASE函数191
5.5各数据库系统独有函数
5.5.1MySQL中的独有函数
5.5.2MS SQLServer中的独有函数202
5.5.3 Oracle中的独有两数206
第6章索引与约束209
索引209
6.2约束211
6.2.1非空约束211
6.2.2唯一约束212
6.2.3 CHECK约束217
主键约束221
6.25外键约束224
第7章表连接233
表连接简介236
内连接(INNER JOIN)236
7.3不等值连接240
7.4交叉连接241
白连接245
7.6外部连接248
7.6.1左外部连接250
7.6.2右外部连接251
7.6.3全外部连接252
第8章子查询255
子查询入门261
8.1.1单值子查询261
8.1.2列值子查询263
8.2 SELECT列表中的标量了查询265
WHERE子句中的标量子查询267
集合运算符与子查询270
8.4.1IN运算符270
ANY和SOME运算符272
84.3ALL运算符274
8.4.4 EXISTS运算符275
在其他类型SQL语句中的子查询应用
8.51子查询在INSERT讲句中的应用277
8.5.2子查询在UPDATE语句中的应用283
8.5.3了查询在DELETE语句中的应用285
第9章主流数据库的SQL语法差异解决方案
9.1SQL语法差异分析287
9.1.1数据类型的差异287
9.1.2运算符的差异288
9.1.3函数的差异289
9.1.4常用SQL的差异289
9.1.5取元数据信息的差异290
消除差异性的方案293
9.2.1为每种数据库编写不同的SQL语句
使用语法交集294
9.2.3使用SQL实体对象294
9.24使用OR M工具295
9.2.5使用SQL翻译器296
9.3CowNewSQL翻译器299
9.3.1CowNewSQL支持的数据类型299
9.3.2CowNewSQL支持的SQL语法
9.3.3CowNewSQL支持的函数305
9.3.4CowNewSQL的使用方法309
第10章高级话题313
10.1SQL注入漏洞政防313
10.1.1SQL注入漏洞原理313
10.1.2过滤敏感字符314
10.1.3使用参数化SQL315
10.2SQL调优316
10.2.1SQL调优的基本原则317
10.2.2索引317
10.2.3全表扫描和索引查找318
10.2.4优化手法318
10.3事务324
10.3.1事务简介324
10.3.2事务的隔离325
10.3.3事务的隔高级别326
10.3.4事务的使用327
10.4自动增长字段327
10.4.1 MySQL中的自动增长字段327
10.4.2MS SQLServer中的自动增长字段
10.4.3 Oracle小的自动增长字段
10.4.4DB2中的自动增长字段332
10.5业务主键与逻辑主键333
10.6NULL的学问334
10.6.1NULL与比较运算符
10.6.2NULL和计算字段337
10.6.3NULL和字符串
10.6.4NULL和函数339
10.6.5NULL和聚合函数339
10.7开窗两数340
10.7.1开窗函数简介342
10.7.2 PARTITION BY子句
10.7.3 ORDER BY丁句
10.7.4高级开窗函数353
10.8 WITH子句与子查询360
第11章案例讲解363
11.1报表制作371
11.1.1显示制单人详细信息371
11.1.2显示销售单的详细信息373
11.1.3计算收益374
11.1.4产品销售额统计378
11.1.5统计销售记录的份额379
11.1.6为采购单分级380
11.1.7检索所有重叠日期销售单383
1LL8为查询编号385
11.1.9标记所有单内最大销售量386
11.2排序389
11.2.1非字段排序规则389
11.2.2随机排序390
11.3表间比较391
11.3.1检索制作过采购单的人制作的销售单391
11.3.2检索没有制作过采购单的人制作的销售单392
114表复制394
11.4.1复制源表的结构并复制表中的数据394
1L4.2只复制源表的结构395
11.5计算字符在字符串中出现的次数396
11.6去除最高分、最低分396
11.6.1去除所有最低、最高值397
11.6.2只去除一个最低,最高值397
11.7与日期租关的应用398
11.7.1计算销售确认口和制单口之间相关的天数398
11.7.2计算两张销售单之问的时间间隔399
11.7.3计算销售单制单日期所在年份的天数401
11.7.4计算销售单制单日期所在月份的第一天和最后一天402
1L.8结果集转置403
11.8.1将结果集转置为一行404
11.8.2把结果集转置为多行406
11.9递归查询410
11.9.1 Oracle中的CONNECT BY子句410
11.9.2 Oracle中的SYS CONNECT BY PATHO函数414
11.9.3MySQL Server和DB 2中通归查询415