《程序员的SQL金典.pdf》由会员分享,可在线阅读,更多相关《程序员的SQL金典.pdf(88页珍藏版)》请在三一文库上搜索。
1、程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 l 高度提取不同数据库的共同点,仔细分析不同点,并给出 解决方案,同时学会 MSSQLServer、MYSQL、Oracle、DB2 数据库不再是梦 l 国内第一本讲解开窗函数实际应用的图书 轻举技术之“纲”, 张合用之“目”, 锻造 SQL 高可用性数据库应用指南从理论到实践, 凝聚 SQL 主流数据库最前沿的技术要领。 本书特色:主要介绍 SQL 的语法规则及在实际开发中的应用,并且对 SQL 在 MySQL、 MS SQL Server、Oracle 和 DB2 中的差异进行了分析;详细讲解数据库对增、删、改、查等 SQL 的支
2、持并给出了相应的 SQL 应用案例;透彻分析函数、子查询、表连接、不同 DBMS 中 的 SQL 语法差异、SQL 调优、NULL 值处理、事务、开窗函数等高级技术;通过对实际案例 开发过程的详细分析,使读者掌握 SQL 的综合应用技巧。 内容提要 本书主要介绍SQL以及在实际开发中的应用, 并且对SQL在MYSQL、 MSSQLServer、 Oracle 和 DB2 中的差异性进行了分析。本书分为三部分:第一部分为基础篇,主要讲解数据库对 增删改查等 SQL 的支持,给出了这些 SQL 的应用案例;第二部分为进阶篇,讲解了函数、 子查询、表联接、不同 DBMS 中 SQL 语法差异、SQL
3、 调优、NULL 值处理、事务、开窗函数 等高级技术;第三部分为案例篇,讲解了前两部分的知识的综合运用。此书适用于学习数据 库编程的读者,对于有一定数据库开发经验的读者也有非常大的参考价值。 前言 市面上讲解数现在据库的书都花了很多篇幅讲解数据库的备份、授权、调优、修复、监 控等内容,这些内容是数据库管理员(DBA)应该掌握的,而对于程序员来说更需要去掌握 的则是 SQL 语句的使用。但是市面上专门讲解 SQL 语句的书非常少,初学者学习数据库开 发过程中常常被那些写给 DBA 的书弄的晕头转向,无法真正快速的掌握 SQL 技术;而且这 些书中讲解的 SQL 也常常是针对特定数据库系统的专有实
4、现,无法很容易的在其他数据库 系统中运行,读者需要阅读大量的书和查阅大量的文档才能掌握不同数据库系统的使用。 本书是专门写给程序员的,因此没有讲解备份、授权、调优、修复、监控等开发人员不 关心的内容,直接从 SQL 语句入手让读者快速的掌握数据库开发的技能。 “面向开发人员, 讲解对开发人员最有用的知识”是本书的编写宗旨。 MYSQL、MSSQLServer、Oracle 和 DB2 等都是非常流行的数据库管理系统(DBMS) ,虽 然在大部分 SQL 语法上这些 DBMS 实现都是一致的, 不过在实现细节以及高级语法方面这些 DBMS 的实现差异还是非常大的。如果编写能够兼容这些 DBMS
5、的 SQL 语句是开发人员经常 需要面对的问题。本书将帮助读者从根本上解决这个问题。 很多开发人员对于 SQL 语句的掌握只限于简单的 SELECT、UPDATE 语句,对于稍微复杂 的逻辑经常需要编写程序代码来完成, 这不仅无法发挥数据库的优势, 而且开发出的系统性 能非常低,而如果能够使用数据库函数、子查询、表联接、开窗函数等高级的 SQL 特性则 可以大大简化系统开发的难度, 并且提高系统的性能。 本书将对这些高级特性进行详细的讲 解。 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 本书第 1、2 章介绍数据库系统的基本知识以及基本操作;第 3 章介绍 Insert、Del
6、ete 和 Update 语句的基本应用;第 4 章对 Select 语句进行全面的介绍,对模糊匹配、分组、 限制数据条数、计算字段、组合查询等高级内容进行了重点的讲解;第 5 章介绍常用的数据 库函数以及它们在主流 DBMS 中的实现差异;第 6 章介绍索引与约束等知识点;第 7、8 章 分别介绍表连接、子查询等高级查询技术;第 9 章对主流 DBMS 的语法差异进行分析,并且 给出了解决方案;第 10 章介绍注入漏洞攻击、SQL 调优、事务、自动增长字段、NULL 值处 理、开窗函数等高级话题;第 11 章以一个案例讲解书中知识点在实际开发中的应用。 在此,我要感谢为这本书的诞生给于我帮助
7、的所有人。首先我要感谢 CowNew 开源团 队的朋友们一直以来的无私奉献; 感谢 KingChou 在开发 CowNewSQL 过程中的卓越工作, 没 有 CowNewSQL 也就不会有这本书的问世;还要感谢 EasyJF 的蔡世友,他一直以来对开源事 业的奉献是值得我学习的; 最后我要感谢电子工业出版社的田小康经理, 他的高效工作使得 本书能够顺利的完成和出版。 如果您对我的书有任何意见和建议,您可以给我发送邮件:,本书 相关的后续资料将会发布到 CowNew 开源团队网站(h p: /w ww. cownew . com )中。 第 1 章 数据库入门 1 1.1 数据库概述 1 1.1
8、.1 数据库与数据库管理系统 1 1.1.2 数据库能做什么 2 1.1.3 主流数据库管理系统介绍 2 1.2 数据库基础概念 5 1.2.1 Catalog 5 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 数据库的语言SQL 13 1.2.10 DBA 与程序员 14 第 2 章 数据表的创建和管理 17 2.1 数据类型 17 2.1.1 整数类型 17 2.
9、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 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 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 简化
10、的 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 SELECT 基本用法 48 4.1.1
11、 简单的数据检索 48 4.1.2 检索出需要的列 49 4.1.3 列别名 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.1 MySQL 81 4.4.2 MS S
12、QL Server 2000 82 4.4.3 MS SQL Server 2005 83 4.4.4 Oracle 84 4.4.5 DB2 86 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 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
13、.8.3 UNION ALL 112 4.8.4 联合结果集应用举例 114 第 5 章 函数 119 5.1 数学函数 122 5.1.1 求绝对值 122 5.1.2 求指数 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
14、求余切 132 5.1.16 求圆周率值 132 5.1.17 弧度制转换为角度制 133 5.1.18 角度制转换为弧度制 134 5.1.19 求符号 134 5.1.20 求整除余数 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 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 5.2.5 截去字符串右侧空格 140 5.2.6 截
15、去字符串两侧的空格 141 5.2.7 取子字符串 143 5.2.8 计算子字符串的位置 144 5.2.9 从左侧开始取子字符串 145 5.2.10 从右侧开始取子字符串 146 5.2.11 字符串替换 147 5.2.12 得到字符的 ASCII 码 148 5.2.13 得到一个 ASCII 码数字对应的字符 149 5.2.14 发音匹配度 151 5.3 日期时间函数 153 5.3.1 日期、时间、日期时间与时间戳 153 5.3.2 主流数据库系统中日期时间类型的表示方式 154 5.3.3 取得当前日期时间 154 5.3.4 日期增减 157 5.3.5 计算日期差额
16、166 5.3.6 计算一个日期是星期几 172 5.3.7 取得日期的指定部分 177 5.4 其他函数 183 5.4.1 类型转换 183 5.4.2 空值处理 188 5.4.3 CASE 函数 191 5.5 各数据库系统独有函数 194 5.5.1 MySQL 中的独有函数 195 5.5.2 MS SQL Server 中的独有函数 202 5.5.3 Oracle 中的独有函数 206 第 6 章 索引与约束 209 6.1 索引 209 6.2 约束 211 6.2.1 非空约束 211 6.2.2 唯一约束 212 6.2.3 CHECK 约束 217 6.2.4 主键约束
17、 221 6.2.5 外键约束 224 第 7 章 表连接 233 7.1 表连接简介 236 7.2 内连接(INNER JOIN) 236 7.3 不等值连接 240 7.4 交叉连接 241 7.5 自连接 245 7.6 外部连接 248 7.6.1 左外部连接 250 7.6.2 右外部连接 251 7.6.3 全外部连接 252 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 第 8 章 子查询 255 8.1 子查询入门 261 8.1.1 单值子查询 261 8.1.2 列值子查询 263 8.2 SELECT 列表中的标量子查询 265 8.3 WHERE 子句中
18、的标量子查询 267 8.4 集合运算符与子查询 270 8.4.1 IN 运算符 270 8.4.2 ANY 和 SOME 运算符 272 8.4.3 ALL 运算符 274 8.4.4 EXISTS 运算符 275 8.5 在其他类型 SQL 语句中的子查询应用 277 8.5.1 子查询在 INSERT 语句中的应用 277 8.5.2 子查询在 UPDATE 语句中的应用 283 8.5.3 子查询在 DELETE 语句中的应用 285 第 9 章 主流数据库的 SQL 语法差异解决方案 287 9.1 SQL 语法差异分析 287 9.1.1 数据类型的差异 287 9.1.2 运算
19、符的差异 288 9.1.3 函数的差异 289 9.1.4 常用 SQL 的差异 289 9.1.5 取元数据信息的差异 290 9.2 消除差异性的方案 293 9.2.1 为每种数据库编写不同的 SQL 语句 293 9.2.2 使用语法交集 294 9.2.3 使用 SQL 实体对象 294 9.2.4 使用 ORM 工具 295 9.2.5 使用 SQL 翻译器 296 9.3 CowNewSQL 翻译器 299 9.3.1 CowNewSQL 支持的数据类型 299 9.3.2 CowNewSQL 支持的 SQL 语法 300 9.3.3 CowNewSQL 支持的函数 305 9
20、.3.4 CowNewSQL 的使用方法 309 第 10 章 高级话题 313 10.1 SQL 注入漏洞攻防 313 10.1.1 SQL 注入漏洞原理 313 10.1.2 过滤敏感字符 314 10.1.3 使用参数化 SQL 315 10.2 SQL 调优 316 10.2.1 SQL 调优的基本原则 317 10.2.2 索引 317 10.2.3 全表扫描和索引查找 318 10.2.4 优化手法 318 10.3 事务 324 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 10.3.1 事务简介 324 10.3.2 事务的隔离 325 10.3.3 事务的隔离级
21、别 326 10.3.4 事务的使用 327 10.4 自动增长字段 327 10.4.1 MySQL 中的自动增长字段 327 10.4.2 MS SQL Server 中的自动增长字段 328 10.4.3 Oracle 中的自动增长字段 329 10.4.4 DB2 中的自动增长字段 332 10.5 业务主键与逻辑主键 333 10.6 NULL 的学问 334 10.6.1 NULL 与比较运算符 336 10.6.2 NULL 和计算字段 337 10.6.3 NULL 和字符串 338 10.6.4 NULL 和函数 339 10.6.5 NULL 和聚合函数 339 10.7
22、开窗函数 340 10.7.1 开窗函数简介 342 10.7.2 PARTITION BY 子句 344 10.7.3 ORDER BY 子句 346 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 11.1.8 为查询编号 3
23、85 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 11.4 表复制 394 11.4.1 复制源表的结构并复制表中的数据 394 11.4.2 只复制源表的结构 395 11.5 计算字符在字符串中出现的次数 396 11.6 去除最高分、最低分 396 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 11.6.1 去除所有最低、最高值 397
24、11.6.2 只去除一个最低、最高值 397 11.7 与日期相关的应用 398 11.7.1 计算销售确认日和制单日之间相差的天数 398 11.7.2 计算两张销售单之间的时间间隔 399 11.7.3 计算销售单制单日期所在年份的天数 401 11.7.4 计算销售单制单日期所在月份的第一天和最后一天 402 11.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_PAT
25、H()函数 414 11.9.3 My SQL Server 和 DB2 中递归查询 415 附录 A 常用数据库系统的安装和使用 417 A.1 DB2 的安装和使用 417 A.2 MySQL 的安装和使用 429 A.3 Oracle 的安装和使用 441 A.4 Microso S Q L S erver 的安装和使用 452 第一章 数据库入门 本章介绍数据库的入门知识, 首先介绍什么是数据库, 然后介绍数据库中的一些基本概 念,接着介绍操纵数据库的不同方式,最后介绍操纵数据库时使用的语言 SQL,在章节中我 们还将穿插一些非常有趣的话题。 1.1 数据库概述 广义上来讲,数据库就是
26、“数据的仓库” ,计算机系统经常用来处理各种各样大量的数 据,比如使用计算机系统收集一个地区的人口信息、检索符合某些条件的当地人口信息、当 一个人去世后还要从系统中删除此人的相关信息。 我们可以自定义一个文件格式, 然后把人 口数据按照这个格式保存到文件中, 当需要对已经存入的数据进行检索或者修改的时候就重 新读取这个文件然后进行相关操作。这种数据处理方式存在很多问题, 比如需要开发人员熟 悉操作磁盘文件的函数、 开发人员必须编写复杂的搜寻算法才能快速的把数据从文件中检索 出来、当数据格式发生变化的时候要编写复杂的文件格式升级程序、很难控制并发修改。 在计算机系统在各个行业开始普遍应用以后,
27、计算机专家也遇到了同样的问题, 因此他 们提出了数据库理论,从而大大简化了开发信息系统的难度。数据库理论的鼻祖是 Charles W.Bachman,他也因此获得了 1973 年的图灵奖。IBM 的 Ted Codd 则首先提出了关系数据库 理论,并在 IBM 研究机构开发原型,这个项目就是 R 系统,并且使用 SQL 做为存取数据表 的语言,R 系统对后来的 Oracle、Ingres 和 DB2 等关系型数据库系统都产生了非常重要的影 响。 1.1.1 “数据库”与“数据库管理系统” 前面我们讲到数据库就是“数据的仓库” ,我们还需要一套系统来帮助我们管理这些数 据,比如帮助我们查询到我们
28、需要的数据、帮我们将过时的数据删除,这样的系统我们称之 为数据库管理系统(Database Management System,DBMS) 。有时候很多人也将 DBMS 简称 为“数据库” ,但是一定要区分“数据库”的这两个不同的意思。 数据库管理系统是一种操纵和管理数据库的系统软件, 是用于建立、 使用和维护数据库。 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 它对数据库进行统一的管理和控制, 以保证数据库的安全性和完整性。 用户通过 DBMS 访问 数据库中的数据,数据库管理员也通过 DBMS 进行数据库的维护工作。它提供多种功能,可 使多个应用程序和用户用不同的方法在同时
29、或不同时刻去建立, 修改和询问数据库。 它使用 户能方便地定义和操纵数据, 维护数据的安全性和完整性, 以及进行多用户下的并发控制和 恢复数据库。通俗的说,DBMS 就是数据库的大管家,需要维护什么数据、查找什么数据的 话找它告诉他了,它会帮你办的干净利落。 1.1.2 数据库能做什么 数据库能够帮助你储存、组织和检索数据。数据库以一定的逻辑方式组织数据,当我们 要对数据进行增删改查的时候数据库能非常快速的完成所要求的操作; 同时数据库隐藏了数 据的组织形式, 我们只要对数据的属性进行描述就可以了, 当我们要对数据库中的数据进行 操作的时候只要告诉“做什么” (What to do)就可以了,
30、DBMS 会决定一个比较好的完成操 作的方式,也就是我们无需关心“怎么做” (How to do) ,这样我们就能从数据存储的底层 中脱身出来,把更多精力投入到业务系统的开发中。 数据库允许我们创建规则, 以确保在增加、 更新以及删除数据的时候保证数据的一致性; 数据库允许我们指定非常复杂的数据过滤机制, 这样无论业务规则多么复杂, 我们都能轻松 应对;数据库可以处理多用户并发修改问题;数据库提供了操作的事务性机制,这样可以保 证业务数据的万无一失。 1.1.3 主流数据库管理系统介绍 目前有许多 DBMS 产品, 如 DB2、 Oracle、 Microso S Q L S erver 、
31、Sybase SQLServer、 Informix、 MySQL 等,它们在数据库市场上各自占有一席之地。下面简要介绍几种常用的数据库管理 系统。 (1)DB2 DB2 第一种使用使用 SQL 的数据库产品。DB2 于 1982 年首次发布,现在已经可以用 在许多操作系统平台上,它除了可以运行在 OS/390 和 VM 等大型机操作系统以及中等规模 的 AS/400 系统之外,IBM 还提供了跨平台(包括基于 UNIX 的 LINUX,HP-UX,Sun Solaris, 以及 SCO UnixWare;还有用于个人电脑的 Windows 2000 系统)的 DB2 产品。应用程序可以 通过
32、使用微软的 ODBC 接口、Java 的 JDBC 接口或者 CORBA 接口代理来访问 DB2 数据库。 DB2 有不同的版本, 比如 DB2 Everyplace 是为移动用户提供的一个内存占用小且性能出 色的版本;DB2 for z/OS 则是为主机系统提供的版本;Enterprise Server Edi o n( ESE) 是一种适 用于中型和大型企业的版本; Workgroup Server Edi o n( W S E) 主要适用于小型和中型企业, 它提供除大型机连接之外的所有 ESE 特性;而 DB2 Express 则是为开发人员提供的可以免费 使用的版本。 IBM 是最早进
33、行关系数据库理论研究和产品开发的公司, 在关系数据库理论方面一直走 在业界的前列,所以 DB2 的功能和性能都是非常优秀的,不过对开发人员的要求也比其他 数据库系统更高, 使用不当很容易造成宕机、 死锁等问题; DB2 在 SQL 的扩展方面比较保守, 很多其他数据库系统支持的 SQL 扩展特性在 DB2 上都无法使用;同时 DB2 对数据的类型要 求也非常严格, 在数据类型不匹配的时候会报错而不是进行类型转换, 而且如果发生精度溢 出、数据超长等问题的时候也会直接报错,这虽然保证了数据的正确性,但是也使得基于 DB2 的开发更加麻烦。因此,很多开发人员称 DB2 为“最难用的数据库系统” 。
34、 (2)Oracle Oracle 是和 DB2 同时期发展起来的数据库产品,也是第二个采用 SQL 的数据库产品。 Oracle 从 DB2 等产品中吸取到了很多优点,同时又避免了 IBM 的官僚体制与过度学术化, 大胆的引进了许多新的理论与特性,所以 Oracle 无论是功能、性能还是可用性都是非常好 的。 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 (3)Microso S Q L S erver Microso S Q L S erver 是微软推出的一款数据库产品。 细心的读者也许已经发现我们前面 提到了另外一个名字非常相似的 Sybase SQLServer,这里的
35、名字相似并不是一种巧合,这还 要从 Microso S Q L S erver 的发展史谈起。 微软当初要进军图形化操作系统,所以就开始和 IBM“合作”开发 OS/2,最终当然无 疾而终, 但是微软就很快的推出了自己的新一代视窗操作系统; 而当微软发现数据库系统这 块新的市场的时候, 微软没有自己重头开发一个数据库系统, 而是找到了 Sybase 来 “合作” 开发基于 OS/2 的数据产品, 当然微软达到目的以后就立即停止和 Sybase 的合作了, 于 1995 年推出了自己的 Microso S Q L S erver6. 0 ,经过几年的发展终于在 1998 年推出了轰动一时的 Mi
36、croso S Q L S erver7. 0 ,也正是这一个版本使得微软在数据库产品领域有了一席之地。正因 为这段“合作”历史,所以使得 Microso S Q L S erver 和 Sybase SQLServer 在很多地方非常类 似,比如底层采用的 TDS 协议、支持的语法扩展、函数等等。 微软在 2000 年推出了 Microso SQ L Server 2000 ,这个版本继续稳固了 Microso SQ L Server 的市场地位,由于 Windows 操作系统在个人计算机领域的普及,Microso S Q L S erver 理所当然的成为了很多数据库开发人员的接触的第一个
37、而且有可能也是唯一一个数据库产 品,很多人甚至在“SQL Server”和“数据库”之间划上了等号,而且用“SQL”一次来专指 Microso S Q L S erver ,可见微软的市场普及做的还是非常好的。做足足够的市场以后,微软 在 2005 年“审时度势”的推出了 Microso SQ L Server 2005 ,并将于 2008 年发布新一代的 Microso S Q L S erver 2 008 。 Microso S Q L S erver 的可用性做的非常好, 提供了很多了外围工具来帮助用户对数据库 进行管理, 用户甚至无需直接执行任何 SQL 语句就可以完成数据库的创建、
38、 数据表的创建、 数据的备份/恢复等工作;Microso SQ L Server 的开发者社区也是非常庞大的,因此有众多 可以参考的学习资料,学习成本非常低,这是其他数据库产品做不具有的优势;同时从 Microso S Q L S erver 2 005 开始开发人员可以使用任何支持.Net 的语言来编写存储过程, 这进 一步降低了 Microso S Q L S erver 的使用门槛。 不过正如微软产品的一贯风格,Microso S Q L S erver 的劣势也是非常明显的:只能运行 于 Windows 操作系统,因此我们无法在 Linux、Unix 上运行它;不管微软给出什么样的测试
39、 数据, 在实际使用中 Microso S Q L S erver 在大数据量和大交易量的环境中的表现都是不尽人 意的,当企业的业务量到达一个水平后就要考虑升级到 Oracle 或者 DB2 了。 (4)MySQL MySQL 是一个小型关系型数据库管理系统,开发者为瑞典 MySQL AB 公司。目前 MySQL 被广泛地应用在中小型系统中,特别是在网络应用中用户群更多。MySQL 没有提供一些中 小型系统中很少使用的功能, 所以 MySQL 的资源占用非常小, 更加易于安装、 使用和管理。 由于 MySQL 是开源的,所以在 PHP 和 Java 开发人员心中更是首选的数据库开发搭档, 目前
40、 Internet 上流行的网站构架方式是 LAMP(Linux+Apache+MySQL+PHP) ,即使用 Linux 作 为操作系统, Apache 作为 Web 服务器, MySQL 作为数据库, PHP 作为服务器端脚本解释器。 MySQL 目前还很难用于支撑大业务量的系统,所以目前 MySQL 大部分还是用来运行非 核心业务;同时由于 MySQL 在国内没有足够的技术支持力量,所以对 MySQL 的技术支持工 作是由 ISV 或者系统集成商来承担,这也导致部分客户对 MySQL 比较抵制,他们更倾向于 使用有更强技术支持力量的数据库产品。 1.2 数据库基础概念 要想使用数据库,我
41、们必须熟悉一些基本概念,这些概念包括:Catalog、表、列、数据 类型、记录、主键以及表关联等等。 1.2.1 Catalog 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 数据库就是数据的仓库,而 DBMS 是数据库的“管理员” 。一些企业即生产食品又生产 农用物资, 这些产品都要保存到仓库中, 同时企业内部也有一些办公用品需要保存到仓库中。 如果这些物品都保存到同一个仓库中的话会造成下面的问题: l 不便于管理。 食品的保存和复印纸的保存需要的保存条件是不同的, 食品需要低温保鲜 而复印纸则需要除湿,不同类的物品放在一起加大了管理的难度; l 可能会造成货位冲突。食品要防止
42、阳光直射造成的变质,因此要摆放到背阴面,同时为 了防止受潮,也要把它们摆放到高处;办公用胶片也要避免阳光直射,所以同样要摆放 到背阴面,而且胶片也要防潮,所以同样要把它们摆放到高处。这就造成两种货物占据 的货位相冲突了。 l 会有安全问题。 由于所有物品都放到一个仓库中没有进行隔离, 所以来仓库领取办公用 品的人员可能会顺手牵羊将食品偷偷带出仓库。 既然都是“仓库” ,那么数据库系统也存在类似问题。如果企业将人力资源数据和核心 业务数据都保存到一个数据库中同样会造成下面的问题: l 不便于管理。为了防止数据丢失,企业需要对数据进行定期备份,不过和核心业务数据 比起来人力资源数据的重要性要稍差,
43、 所以人力资源数据只要一个月备份一次就可以了, 而核心业务数据则需要每天都备份。 如果将这两种数据保存在一个数据库中会给备份工 作带来麻烦。 l 可能会造成命名冲突。比如人力资源数据中需要将保存员工数据的表命名为 Persons, 而核心业务数据也要将保存客户数据的表也命名为 Persons,这就会相冲突了。 l 会有数据安全问题。由于所有的数据都保存在一个数据库中, 这样人力资源系统的用户 也可以访问核心业务系统中的数据,很容易造成数据安全问题。 显而易见, 对于上边提到的多种物品保存在一个仓库中的问题, 最好的解决策略就是使 用多个仓库,食品保存在食品仓库中,农用物资保存在农用物资仓库中,
44、而办公用品则保存 在办公用品仓库中,这样就可以解决问题了。问了解决同样的问题,DBMS 也采用了多数据 库的方式来保存不同类别的数据,一个 DBMS 可以管理多个数据库,我们将人力资源数据保 存在 HR 数据库中,而将核心业务数据保存在 BIZ 数据库中,我们将这些不同数据库叫做 Catalog(在有的 DBMS 中也称为 Database,即数据库) 。采用多 Catalog 以后可以给我们带 来如下好处: l 便于对各个 Catalog 进行个性化管理。 DBMS 都允许我们指定将不同的 Catalog 保存在不 同的磁盘上, 由于人力资源数据相对次要一些, 因此我们可以将HR保存在普通硬
45、盘上, 而将 BIZ 保存在 RAID 硬盘上。我们还可以对每个 Catalog 所能占据的最大磁盘空间、日 志大小甚至优先级进行指定,这样就可以针对不同的业务数据进行个性化定制了。 l 避免了命名冲突。同一个 Catalog 中的表名是不允许重复的,而不同 Catalog 中的表名 则是可以重复的,这样 HR 中可以有 Persons 表,而 BIZ 中也可以有 Persons 表,二者结 构可以完全不相同,保存的数据也不会互相干扰。 l 安全性更高。DBMS 允许为不同的 Catalog 指定不同的用户,并且可以限定用户能访问 的 Catalog。比如用户 hr123 只能访问 HR,而用
46、户 sales001 只能访问 BIZ。这就大大加 强了系统数据的安全性。 1.2.2 表(Table) 虽然我们已经将不同用途的物品保存在不同的仓库中了, 但是在同一个仓库中数据的保 存仍然存在问题。比如食品分为熟食、生肉、大米等,如果把他们随意的堆放在一起,就会 造成我们无法很容易的对这些食品进行管理, 当要对大米进行提货的话就必须在一堆的食品 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 中翻来翻去。解决这个问题的方法就是将仓库划分为不同的区域,熟食保存在熟食区,生肉 保存在生肉区,而大米则保存在大米区。 DBMS 中也存在类似的问题,虽然我们将核心业务数据保存在 BIZ
47、数据库中了,但是核 心业务数据也有很多不同类型的数据,比如客户资料、商品资料、销售员资料等,如果将这 些数据混杂在一起的话将会管理起来非常麻烦, 比如我们要查询所有客户资料的话就必须将 所有数据查询一遍。解决这个问题的方法就是将不同类型的资料放到不同的“区域”中,我 们将这种区域叫做 “表”(Table) 。 客户资料保存到 Customers 表中, 将商品资料保存在 Goods 表中,而将销售员资料保存在 SalesMen 表中,这样当需要查找商品的时候只要到 Goods 表 中查找就可以了。 1.2.3 列(Column) 同样是生肉,不同的生肉又有不同的特性,有的生肉是里脊肉,有的生肉
48、是前臀尖,这 块生肉是 18 公斤,而那块生肉是 12 公斤,这块生肉是 12.2 元/公斤,而那块生肉是 13.6 元/公斤。每块肉都有各自的不同的特性,这些特性包括取肉部位、重量、单价。如果不对 每块肉标注这些特性数据的话,当提货人要我们将所有里脊肉出库的话我们就非常麻烦了。 解决这个问题的方法就是制作一些标签,在这个标签上标明取肉部位、重量、单价,这样要 提取货物就会非常方便了。 不仅如此,标签的格式也要统一,如果第一块生肉的标签内容是: 另一块生肉的标签内容是: 采用这种标签由于没有统一的格式,所以阅读起来非常麻烦,要靠人工去分辨,错误率 非常高。如果我们规定一个统一的标签格式,比如下
49、面的标签: 取肉部位 重量 单价(元/公斤) 这样每块肉的标签就可以按照这个格式来填写了: 取肉部位 里脊肉 重量 15.6 单价(元/公斤) 13.2 这种格式阅读起来非常方便, 如果引入自动识别设备的话, 甚至可以实现自动化的物品 分拣。 在数据库的表中保存的数据也有类似问题, 如果不规定格式的话, 表中的数据也会非常 阅读,如果一个员工的资料在表中保存的内容为: 每 市 斤 8.6 元,前臀尖, 13.6公 斤 的, 。 这 块 肉 是 15.6 公斤的 里脊肉, 13.2 元/公斤。 程序员的 SQL 金典 第一本专门为程序员编写的数据库图书 另外一个员工的资料在表中保存的内容为: 通常, 以这种不标准的格式保存造成数据十分混乱, 想要从数据库中取出合适的数据仍 然非常麻烦。为了解决这个问题,我们规定下面这种标准的格式: 姓名 部门 入职时间 这里的“姓名” 、 “部门”和“入职时间”就被称为员工表的列(Column) ,有时候也叫 做字段(Field) ,每个列描述了数据的一个特性。 1.2.4 数据类型(DataType) 上面我们为员工表规定了“姓名” 、 “部门”和“入职时间”三个列,这样只要按照这个 格式进行数据填写就可以了, 但是这里仍然有一个问题, 那
链接地址:https://www.31doc.com/p-3721734.html