最近获得的《Java网络编程实例》一书的源代码,上次在CSDN看到一个相同的资源,结果一下载打开,机子就中毒了,强烈鄙视那种上传病毒的人!
2024-04-16 15:31:19 8.51MB Java网络编程实例源代码
1
Visual c++数字图像处理典型算法及实例随书源代码
2024-01-25 08:04:01 1.78MB 图像处理算法
1
《C++ GUI Qt4编程》(第二版)的随书示例源代码,包含windows和Linux两个平台
2023-12-13 08:01:26 1.16MB Qt4示例代码 随书源码 随书源代码
1
Windows + 程序设计(第5版) + 中英文版电子书 + 随书源代码
1
Visual C++实践与提高-COM和COM+篇(高清pdf + 随书源代码).part2,很好的COM技术学习资料
2022-10-12 11:39:48 13.31MB Visual C++实践与提高 COM和COM+篇
1
C和指针的随书源代码(Pointers On C) 从Kenneth A.Reek的主页上下的.
2022-08-03 10:16:53 48KB C和指针 源代码 Pointers On
1
C++ Prime Plus第六版中文版随书源代码 从第二章到第十八章书本源代码,提供给大家,以便大家更好的学习C++
2022-07-29 11:36:21 179KB 学习交流
1
Head First HTML&CSS; 第2版 中文高清 带标签,压缩包含书和随书源代码
2022-06-22 13:19:05 193.22MB HeadFirst HTML CSS 源代码
1
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《SQL Server 2008数据库设计与实现》的随书源代码 对应的书籍资料见: SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典) 基本信息 原书名: Pro SQL Server 2008 Relational Database Design and Implementation 原出版社: Apress 作者: (美)Louis Davidson    Kevin Kline    译者: 程桦 张绪业 丛书名: 图灵程序设计丛书 数据库 出版社:人民邮电出版社 ISBN:9787115215543 上架时间:2009-10-30 出版日期:2009 年11月 开本:16开 页码:560 版次:1-1 编辑推荐    资深数据库专家的心血力作    SQL Server设计思想的独到解析    关系数据库实现的通关宝典 内容简介   本书深入浅出地介绍了目前世界上最受欢迎的数据库管理系统之一——sql server。全书共分三个部分:第一部分阐释了数据库的基本概念,讲解了数据库建模语言;第二部分展示了从概念建模到在 sql server 2008上真正实现数据库的过程;第三部分深入探讨了 sql server若干方面的技术细节,如数据保护、索引、并发访问等。通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了 sql server 2008的技术细节。.   本书浓缩了作者作为 sql server数据库架构师多年来丰富的实践经验,适合各类数据库开发和管理人员学习参考。... 作译者 作者:   Kevin Kline是Quest软件公司SQL Server解决方案的技术战略经理。Kevin从2004年开始就是微软的SQL Server MVP,他是国际SQLServer专家联盟(PASS)创辽委员会的成员和下一届总裁。他独自写作或参与合著了好几本书,包括SQL in a Nutshell(O'Reilly,2004)、Pro SQL Server 2005 Database Design and Optimization(Apress,2006)以及Database Benchmarking:Practical Methods for Oracle&SQL; Server(Rampant,2007)。Kevin给SQL Server Magazine和Database Trendv and Applications杂志供稿,他的博客可以在SQLBlog.com和SQLMag.com上找到。在世界范围内的会议上,比如微软的Tech Ed、PASS社区峰会、微软汀论坛、DevTeach以及SQLConnections,Kevin也是人气最高的演讲者。从1986年开始Kevin就活跃在IT工业中。..   Kurt Windisch是Levi,Ray,and Shoup,Inc.公司内部IT部门的应用程序监管,该公司是——家技术方案的全球供应商,总部位于伊利诺伊州的Springfield。Kurt在IT工业中的经验超过了17年。他在SQL Server专家联盟的董事会中服务了5年,为很多SQL Server杂志供过稿,也在讨论SQL Server数据库编程的国际会议上发过言。   Louis Davidson,作为企业数据库开发人员和架构师,他拥有超过15年的工作经验。目前他是田纳西州Nashville的Christian广播网络和NorthStar工作室的数据架构师。对于Louis而言,他全部的职业经验几乎都与微软的SQL Server有关,从早期版本一直到当前最新版本的Beta版。Louis是一本讲数据库设计的书的4个版本的主要作者。Louis主要的兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。   Scott Klein是一位独立咨询师,对SQL Server、.NET和XML相关的所有知识都充满热情。他是几本书的作者,这包括Professional SQL Server 2005 XML(Wrox,2006)和Professional LINQ(Wrox,2008),他还为SQL PASS Community Connector写每两周一次的特辑文章。他也为好几个网站供稿,这包括Wrox(http://www.wrox.com)和TopXML(http://www.topxml.com)。他经常同佛罗里达附近的SQL Server和.NET用户群体交流。Scott住在佛罗里达的Wellington,当他不坐在计算机前时,你会发现他和自己的家人在一起,或者骑着他的雅马哈摩托车轰鸣在当地的摩托车越野赛赛道上。你可以通过ScottKlein@SqlXml.com联系他。 目录 封面 -17 封底 -16 扉页 -15 版权 -14 译者序 -13 关于作者 -12 序 -11 前言 -10 致谢 -6 目录 -4 第1章 数据库概念简介 1 1.1 数据库设计阶段 2 1.1.1 概念阶段 3 1.1.2 逻辑阶段 5 1.1.3 实现阶段 5 1.1.4 物理阶段 6 1.2 关系数据结构 6 1.2.1 数据库和模式 6 1.2.2 表、行和列 7 1.2.3 信息原则 10 1.2.4 域 12 1.2.5 元数据 13 1.2.6 键 13 1.2.7 未显式赋值的项(NULL) 18 1.3 实体之间的关系 20 1.3.1 二元关系 21 1.3.2 非二元关系 24 1.4 数据访问语言(SQL) 24 1.5 理解依赖性 25 1.5.1 函数依赖性 26 1.5.2 判定 26 1.6 总结 27 第2章 数据建模语言 28 2.1 数据建模介绍 28 2.2 实体 29 2.3 属性 32 2.3.1 主键 33 2.3.2 替代键 35 2.3.3 外键 35 2.3.4 域 36 2.3.5 命名 38 2.4 关系 39 2.4.1 识别性关系 40 2.4.2 非识别性关系 40 2.4.3 角色名字 43 2.4.4 关系基数 44 2.4.5 动词短语(关系名字) 49 2.5 描述信息 51 2.6 其他建模方法 52 2.6.1 信息工程 53 2.6.2 Chen ERD 54 2.6.3 Visio 55 2.6.4 Management Studio数据库关系图 56 2.7 最佳实践 57 2.8 总结 57 第3章 概念阶段数据建模 59 3.1 理解需求 60 3.2 文档化过程 61 3.3 需求收集 62 3.3.1 客户访谈 63 3.3.2 要回答的问题 64 3.3.3 现存的系统和原型 67 3.3.4 其他类型的文档 67 3.4 识别对象和过程 69 3.4.1 识别实体 70 3.4.2 实体间关系 76 3.4.3 识别属性和域 82 3.5 识别业务规则和业务过程 90 3.5.1 识别业务规则 90 3.5.2 识别基础业务过程 92 3.6 完成概念模型 93 3.6.1 识别明显的、额外的数据需求 94 3.6.2 和客户一起评审 95 3.6.3 重复以上步骤直到客户同意你的模型 95 3.7 最佳实践 95 3.8 总结 96 第4章 规范化过程 97 4.1 为什么要规范化 98 4.1.1 消灭重复数据 98 4.1.2 避免编写不必要的代码 98 4.1.3 给表瘦身 98 4.1.4 最大化聚集索引的使用 99 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走多远 99 4.3 规范化过程 100 4.4 实体和属性的形式:第一范式 100 4.4.1 所有属性必须是原子的 101 4.4.2 实体的所有实例必须包含相同数量的值 104 4.4.3 实体中出现的所有实体类型都必须不同 106 4.4.4 第一范式所避免的不规则编程 106 4.4.5 当前设计不符合第一范式的线索 110 4.5 属性间的关系 111 4.5.1 第二范式 111 4.5.2 第三范式 116 4.5.3 Boyce-Codd范式 121 4.6 实体中的多值依赖 124 4.6.1 第四范式 124 4.6.2 第五范式 135 4.7 非规范化 136 4.8 最佳实践 136 4.9 总结 137 4.10 额外的例子 137 4.11 本书迄今为止所讲述的故事 142 第5章 实现基础的表结构 144 5.1 评审逻辑设计 147 5.2 变换设计 148 5.2.1 选择名字 148 5.2.2 处理子类型 151 5.2.3 决定树的实现方式 155 5.2.4 选择键的实现方式 156 5.2.5 决定域的实现方式 161 5.2.6 设置模式 172 5.2.7 评审“最终的”实现模型 172 5.3 实现设计 173 5.3.1 创建基本表结构 175 5.3.2 添加唯一性约束 183 5.3.3 构建默认约束 189 5.3.4 添加关系(外键) 195 5.3.5 处理排序规则和排序 205 5.3.6 计算列 209 5.3.7 实现用户定义的数据类型 212 5.3.8 文档化你的数据库 220 5.3.9 处理依赖信息 222 5.4 最佳实践 225 5.5 总结 226 第6章 保护数据的完整性 228 6.1 最佳实践 229 6.2 自动数据保护 231 6.2.1 声明性数据保护 231 6.2.2 基本语法 233 6.2.3 基于简单表达式的CHECK约束 235 6.2.4 基于函数的CHECK约束 237 6.2.5 约束引起的错误 242 6.2.6 DML触发器 244 6.2.7 处理来自触发器和约束的错误 277 6.3 手动数据保护 280 6.4 更多最佳实践 287 6.5 总结 287 第7章 模式与查询技术 289 7.1 预计算值 290 7.1.1 序列表 290 7.1.2 日期计算 297 7.2 二进制大型对象(BLOB) 305 7.3 存储用户自定义数据 307 7.3.1 一长串通用列 308 7.3.2 实体-属性-值(EAV) 309 7.3.3 往表中增加列 313 7.4 通用实现对象 318 7.5 反模式 319 7.5.1 多用途键域 320 7.5.2 通用键引用 322 7.5.3 对非结构化数据的过度使用 325 7.6 总结 326 7.7 回顾与展望 326 第8章 数据访问安全 328 8.1 安全主体与安全对象 329 8.2 数据库安全概述 330 8.2.1 模拟 331 8.2.2 权限 333 8.2.3 控制对象访问 334 8.2.4 角色 338 8.2.5 模式 344 8.3 通过T-SQL编程对象控制对象访问 345 8.3.1 存储过程和标量函数 346 8.3.2 对象内模拟 347 8.3.3 跨数据库边界 352 8.3.4 不同的服务器(分布式查询) 357 8.4 视图与表值函数 357 8.4.1 一般用法 358 8.4.2 使用视图实现可配置的行级安全 360 8.5 数据混淆 364 8.6 监视与审核 367 8.6.1 服务器与数据库审核 367 8.6.2 使用DML触发器查看表的变更历史 371 8.6.3 DDL触发器 374 8.6.4 分析器日志 377 8.7 最佳实践 379 8.8 总结 380 第9章 表结构与索引 382 9.1 数据库物理结构 383 9.1.1 文件与文件组 383 9.1.2 分区与页 386 9.1.3 页中的数据 388 9.1.4 分区 391 9.2 索引概览 393 9.3 基本索引结构 393 9.4 索引类型 395 9.4.1 聚集索引 395 9.4.2 非聚集索引 397 9.4.3 聚集表上的非聚集索引 398 9.5 索引创建的基本方法 400 9.6 基本的索引使用模式 402 9.6.1 使用聚集索引 403 9.6.2 使用非聚集索引 405 9.6.3 使用唯一索引 416 9.7 高级的索引使用案例 416 9.7.1 外键索引 416 9.7.2 索引视图 419 9.8 最佳实践 422 9.9 总结 423 第10章 并发编程 425 10.1 什么是并发 426 10.2 查询优化的基础知识 427 10.3 操作系统与硬件因素 428 10.4 事务 429 10.4.1 事务语法 430 10.4.2 已编译的SQL Server代码 437 10.5 SQL Server并发控制 444 10.5.1 锁 445 10.5.2 隔离级别 448 10.6 完整性与并发性编程 459 10.6.1 悲观锁定 459 10.6.2 实现单线程代码块 461 10.6.3 乐观锁定 463 10.6.4 基于行的锁定 464 10.6.5 逻辑工作单元 469 10.7 最佳实践 470 10.8 总结 471 第11章 数据访问策略 472 11.1 即席SQL 473 11.1.1 优点 474 11.1.2 缺陷 480 11.2 存储过程 484 11.2.1 封装性 485 11.2.2 动态存储过程 486 11.2.3 安全性 488 11.2.4 性能 490 11.2.5 缺陷 491 11.2.6 观点 495 11.3 T-SQL与CLR(公共语言运行时) 497 11.3.1 选择T-SQL的准则 500 11.3.2 选择.NET的准则 501 11.3.3 CLR对象类型 501 11.4 最佳实践 503 11.5 总结 504 附录A Codd的RDBMS十二法则 506 附录B 标量数据类型参考 511 索引 538 译者序   如果将数据库称为现代数字生活的基础,那么这样的说法一点也不夸张——大型企业应用、网站,所有这些东西的背后,都是数据库在支撑。并且,最终说来,产生价值的并不是绚丽的界面和现代化的输入方式,而是存放在数据库中的数据。不幸的是,虽然关系型数据库历经了约30年的发展,有成熟的理论和大量的实践基础,但是,大多数设计、开发人员在设计数据库结构时仍然是“跟着感觉走”,根据业务的需要和编程的方便,把字段这张表放几个那张表放几个完事。对这样设计出来的数据库,只需多问几个为什么——业务模型是如何体现的?数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。.   这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际开发较远——试问有几个人能够以可实践的方式把规范化的几条原则阐述清楚?在工作时,使用的数据库资料和书籍又往往是“手册型”,大多仅仅讲解特定数据库提供的功能。   正如作者所说——“我的书目标很简单,那就是填补这个空白,架起学院教科书与通常针对SQL Server所写的,纯粹面向实践的书之间的桥梁”。翻译的过程中,译者感到此言不虚:作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从数据库设计开发的常用模式到应用程序的数据访问策略,既有理论又紧扣实践。阅读本书的过程,就是把一些以前模糊地知道,但又觉得很难运用的理论实实在在地运用到实践中的过程。   虽然本书是针对SQL Server这个特定数据库平台来阐述理论和实践的,然而,本书所体现的思想和方法,完全可以运用到其他关系数据库平台上。..   翻译的时间很紧,如果没有家人的支持和理解,很难想象如何完成这项工作。   感谢人民邮电出版社图灵公司很好地推动了这本书的翻译工作。另外,图灵公司的论坛上丰富的资料和活跃的讨论也使我们眼界大开,受益良多。   翻译工作并非阐述自己的思想,翻译的第一要务是忠实地传达原著者的思想。虽然无法自由地表达自己的想法,然而,翻译的快乐就在于:使另一个人的好想法能让更多的人了解。当然,由于时间紧张,译者水平有限,错误粗糙之处相信不在少数,敬请广大读者批评指正。   感谢我的妻子魏萍,你容忍我一吃完饭就坐到计算机前。谢谢女儿程灵馨,在爸爸不能陪你玩时,5岁的你居然也表示理解。谢谢作者Louis Davidson,你耐心地回答了我的问题。   程桦   感谢我的未婚妻张艳,是你的鼓励和体贴让我在寒冷的冬日伏案不辍。还要感谢我的家人,你们殷殷的期盼让我产生了对知识的不渝追求。...   张绪业   2009年5月    前言   我经常扪心自问,“为什么要做这件事?为什么还要写新版本?这值得吗?如果我抛开书去打任天堂游戏机,我是不是能帮超级玛丽快点把公主救出来?”在微软MVP 2008年峰会上,这些问题都由一位MVP帮我回答了。他感谢我写了这本书,说他曾经试着读点这方面的大学教材,但那些书都太难了,读不太懂。.   “喔,是的,”我想,“那是我最开始要写这本书的原因。”当我最早开始设计数据库时,我从几位伟大的导师那里学到了不少东西,但是,当我想进一步深入研究时,我开始寻找数据库设计方面的材料,但没找着多少。我找到的最好的一本书是Chris Date的An Introduction to Database Systems(Addison Wesley,2003),然后我读了自己能读懂的部分。然而,我很快就有点晕头转向,没法做到一旦理解了概念之后,就能很好地将关于设计的理论转换到真正的、同时较为简单的设计过程中去。在我所使用的Chris和其他人的教材中,很明显,创建关系模型这件事包含了太多理论,甚至是数学知识。   如果你想要成为一名理论家,那Chris的书就是必读的,当然,除此之外还有很多可以参考的书(最好去看看http://www.dbdebunk.com/books.html,你会找到更多的书)。问题在于,这些书大多数都包含了太多的理论,超出了一般实践工作者所需了解的(或者愿意花时间去读的)内容,并且它们没有真正地深入到实际数据库系统的实现中去。我的书的目标很简单,那就是填补这个空白,在大学教材与通常针对SQL Server所写的、纯粹面向实践的书之间架起一座桥梁。我的目的不是顶替这些书,完全不是,在我的书架上有很多这样的书。本书更像是一本面向技术的书,而不是讲解SQL Server功能的使用手册。我将介绍关系引擎的大多数典型功能,教给你使用它们的技术。然而,我不能说这是你书架上需要的唯一一本书。   如果你有本书以前的版本,你可能会问为什么还需要这个新版本,我了解你的感受。我花了大量时间找出应该买这个新版本的理由,而这个理由并不那么明显——那就是,我现在涵盖了2008的所有功能。很明显,这只是部分原因,最重要的是,我一直在努力加入更多新内容让你的工作更轻松。我加入了一章(第7章)介绍开发模式,每一章中也都加入了大量新材料,从而能帮你改进数据库设计。   诗人和剧作家奥斯卡王尔德曾经说过:“只有年轻人才会无所不知。”现在回头看时有点后悔,自己在写第一本书Professional SQL Server 2000 Database Design之前,以为自己什么都知道。正是那种无知和放纵不羁的热情,才让我有勇气写下第一本书。最后,我确实完成了第一本书,它之所以还不错,主要归功于技术编辑给予的批评。并且,如果我没有最初那种驱使我写完书的热情的话,我也不可能写这本书的第四版。无论如何,如果你花几周的时间逐章逐节地比较了这些书的每个版本的话,你会发现这是个内容逐步丰富的过程,而且作者也在逐步成熟。   过程的逐步丰富和作者的逐渐成熟都有其原因。一个原因是过去两个版本以来我所碰到的编辑:首先是Tony Davis,现在是Jonathan Gennick。他们两人对我的文风都多有指摘,并且他们把本书的结构调整得很棒。另一个原因可以简单地归结为经验,因为从我开始写第一版以来已经过了8年。但是,书中所用的材料之所以有进步,最大的原因还是它们经过了检验。一方面我在对别人贡献着自己的好评论,另一方面我也收到了大量关于如何改进的反馈(其中一些评论可不那么友善)。我非常用心地倾听,从书发布那天开始就记一系列笔记。对于我能用得上的任何反馈,我都会感到很高兴。可以用电子邮件联系我(louis@drsql.org),如果你愿意也可以在我的网站(drsql.org)留下匿名反馈。你可以在网站上找到一个附录,里面含有我希望自己在写这本书时就了解了的材料。   数据库设计的目的   数据库设计的目的是什么?你到底为什么要关心这事?主要的原因是设计良好的数据库用起来很简单,因为所有东西都在其应处于的逻辑位置上。这非常像一个收拾得很好的橱柜,如果你需要红辣椒粉,直接到调味品搁架的红辣椒粉那格就能取到,这就比到处乱找要强得多。但是,许多系统组织得一团糟。即使每件东西都有一个分好的地方,如果找起来很困难,那件东西也就没啥价值了。想象如果一本电话簿完全没有排序会如何?或者,编排字典的时候把词任意放在文字中能放下的地方又会如何?数据库如果组织良好的话,即使要写一两个联结,你也可以靠本能就知道去哪里获取需要的数据。我的意思是,说到底,这难道不是件很有趣的事吗?..   你也可能吃惊地发现,数据库设计是件相当简单的任务,不像听起来那么困难。与随着项目进行而拼凑数据存储相比,要做好这件事需要在项目一开始多花些时间,但是,在项目的整个生命周期中,这样做能获得相应回报。要想正确地进行数据库设计,我们面对的最具挑战性的问题是:与不做设计相比,正确地设计数据库会花更多的时间(在项目计划会议上,关于时间的争论经常发生)。因为数据库设计没有什么可见的东西来让客户感到赏心悦目,因此这一阶段经常会被压缩,目的就是让事情看起来进行得较快。对于普通客户而言,即使是最没有挑战性、最不让人感兴趣的用户界面也比最漂亮的数据模型要吸引人得多。虽然一般说来,数据才是投资创建系统的最终原因,但是,用户界面编程往往占据了中心地位。并不是说你的同事没有注意到一个糟糕的数据模型与一个漂亮的数据模型之间的区别,他们确实注意到了,但是,当程序员需要编码时,往往会顾不上考虑如何能正确地存储数据。我希望自己知道这个难题的答案,因为要是有这个答案,我的书会卖出一百万本。本书将努力提供一些技术和过程,帮助你进行数据库设计,力求对新手清晰易懂,对老练的专家也有所助益。   这个设计和架构数据存储的过程与数据库安装和管理的角色并不相同。例如,作为数据架构师的角色,我很少去创建用户、执行备份,或者去设置复制与集群。我很少谈及这些任务,它们被认为是管理工作,由DBA角色担当。既是开发人员又是DBA的人并不罕见(实际上,如果你在小公司工作,你会发现自己担当了多个角色,以至于不堪重负),但是,如果你能将自己的思维与偏重实现的角色相分离,从而使你能更多地思考数据有多难用,那么一般说来,你设计出的东西会好很多。对许多情况而言,数据库设计没有看起来那样困难。   注解为安全起见,我要澄清一件事:如果你做过任何编程工作的话,毫无疑问,你会反对本书中的某些观点和意见。我完全同意本书不是什么Katmai 的圣路易斯 福音书。我的意见和观点来自于超过16年对数据库的学习、在数据库上的工作,并且由来自于许多不同的人、书、大学课堂和研讨会的知识所补充。我在“致谢”一节已经感谢了其中的许多人,但是,我忘掉的人名也数以百计,我脑中铭刻的某些知识精华就来自于他们。本书所展示的设计方法是所有这些思想的集合。我希望本书能被看作是个有用的学习工具。通过阅读本书和其他人的著作,再实践你自己的想法,你将会总结出自己的方法论,它会适合你自己,并使你成为成功的数据库设计人员。   本书的结构   本书由如下各章组成。   第1章:数据库概念简介。该章提供了对关键术语和概念的简要概览。   第2章:数据建模语言。该章的作用是介绍数据架构师的主要工具——模型。该章详细介绍了一种建模语言——IDEF1X,因为它是本书中用于展示数据库设计的建模语言。还介绍了其他几种常见的建模语言,因为某些读者或者出于偏爱、或者由于公司的要求会使用这些类型的模型。   第3章:概念阶段数据建模。在概念阶段数据建模中,我们的目标是讨论这样的过程:引入顾客的需求集合,将表、列、关系和业务规则放入数据模型格式中相应的地方。   第4章:规范化过程。数据库设计过程的下一步是规范化。规范化的目标是将表、列、关系和业务规则的集合格式化为每个值只在一个地方存储、每张表只代表一个单一实体的形式。在最初几次进行规范化时,这个过程会感觉不太自然,因为你不用琢磨如何使用数据,却必须琢磨数据本身以及结构会如何影响数据的质量。然而,一旦你掌握了规范化,那么,不以规范化的方式存储数据就会让人觉得不舒服。   第5章:实现基础的表结构。在数据库设计过程中,这是第一个要启动SQL Server,开始写脚本来构建数据库对象的时间点。该章讨论了构造表(包括为列选择数据类型)及关系,其中提到了实现后的结构可能与我们在规范化过程中得到的模型不一致的问题。   第6章:保护数据的完整性。除了要将数据安排在表和列中之外,也需要实现其他业务规则。在SQL Server中,保证数据完整性条件得以满足的第一条防线由CHECK约束与触发器构成,因为用户无法轻易绕开由约束和触发器进行的验证。这一章还讨论了其他几种保护数据的方法,它们可以用存储过程和客户端代码来实现。   第7章:模式和查询技术。除了设计表时的各种基本技巧之外,我们还利用几种技巧来构成常见的数据/查询接口,从而方便未来的查询和使用。该章讨论了几种常见的、有用的模式,同时也观察了某些人需要使用的一些模式——有些查询需求的接口实现对你来说非常困难,而这些模式能使它们变得更简单些。 .  第8章:数据访问安全。这些日子以来,安全问题几乎在每个程序员的头脑中都占据了很重要的位置。该章讨论了用来在系统中实现数据安全的某些策略,比如使用视图、触发器、加密,甚至使用SQL ServerProfiler等。   第9章:表结构与索引。该章展示了如何在SQL Server中建立表结构的基础知识,以及某些对数据进行索引以获得更好性能的策略。   第10章:并发编程。数据库设计和实现过程的一部分是不仅要考虑结构,而且还要考虑如何在多个用户之间最大化资源的利用率。该章描述了几种策略,它们都与如何在你的数据访问和修改代码中实现并发相关。   第11章:数据访问策略。该章讨论了关于编写代码来访问SQL Server的许多概念和问题。比较了即席SQL与存储过程(包括两者面对的所有风险和挑战,比如计划的参数化、性能、开发投入、可选参数、SQL注入等),同时也讨论了T-SQL还是CLR对象更好,其中包括用CLR来编码不同类型的对象的示例。有关CLR的材料由Kurt Windisch提供,可以下载的CLR示例代码也由他提供。   附录A:Codd的RDBMS十二法则。本附录介绍了Codd关于数据库应该如何实现的创新的十二条原则。随着硬件的发展,我们离实现他的梦想越来越近。   附录B:标量数据类型参考。本附录介绍了可以被合法地当作标量类型的所有类型,为什么要用它们,以及它们的实现信息和其他细节。   再一次强调,给我反馈时不用犹豫,任何时候都不要犹豫(只要你不在早上3点给我打电话就行)。对任何章节,我都将努力改善大家发现还有所欠缺的地方,并将改善后的内容发布到我的博客上(http://sqlblog.com/blogs/louis_davidson),其标签为DesignBook,同时也会发布到我的网站上(http://drsql.org/ProSQLServerDatabaseDesign.aspx)。如果有什么新的想法或者找到了一些错误,或者有额外的资料,我都会将其添加在这两个地方。因为这是一本书,而不再是零零星星的资料,这两处是我能想到并选来发布信息的地方。...    序言   数据库设计是Louis和我都热衷的事情。今年秋季,我将幸运地和我的朋友Louis Davidson登上同一个舞台。我们将在DevLink会议上演讲,地点是Louis的家乡Nashville,然后,在西雅图的PASS上我们也将同台演讲。在这两次演讲中,我们都将针对数据库设计这个题目开展讨论和辩论,并探讨对以数据为中心的应用来说数据库设计有多关键。.   数据库设计是门科学也是门艺术。规范化应该说是门科学,而确定实体的范围则是一门艺术,需要具有与各种数据库打交道的经验才能学到手。优雅的解决方案都有一种简单的美。Louis不止是位作者和数据库设计人员,也是一位大师级技师。在本书中,你会发现字里行间都隐藏着作者的呼吁——改善你的技能,精心雕刻出能够经受时间考验的数据库,创造一个能让开发人员充分施展拳脚的、虚拟的数据世界。..   数据库设计是每个以数据为中心的应用的基石。一个优雅的数据库设计使得数据一目了然、容易查询,并且使用有效的、基于集的查询将开发人员武装起来,使他们获得成功。但是,如果数据库设计就很糟糕,则无论多少代码也无法补偿,也无法为数据库加上缺失的功能。对任何以数据为中心的应用来说,没有什么角色比数据建模人员这个角色更为重要。用户界面换来换去,但是,即使经历了好几代应用编程语言,数据仍然存在着。数据库架构上犯下的错误迟早会被未来的程序员诅咒,即使他现在还未出生,即使他用的是现在还没发明的语言和工具。在我的好朋友Louis的指导下,多花一点时间来润色你的数据库设计,绝对是件值得的事。   因此,欢迎你阅读本书,这是Louis针对软件世界最重大的工作所写的战地指南的第三版。能够为本书作序我感到无比愉快。...   Paul Nielsen   SQL Server MVP    媒体评论   “跟本书的2005版一样,我认为Louis的这本书写得非常好,信息量极其丰富而且实践性强。阅读过程中,你会觉得是在跟作者讨论问题。我喜欢这本书,还因为它有自己的观点,而非从在线图书中照搬过来……”   —— Amazon读者评论...   
2022-06-15 14:43:41 51KB SQL Server 数据库 设计与实现
1
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj Shamsudeen    Jared Still    译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115266149 上架时间:2011-11-9 出版日期:2011 年11月 开本:16开 页码:502 版次:1-1 主编推荐     资深Oracle专家力作,OakTable团队推荐     全面、独到、翔实,题材丰富     Oracle开发人员和DBA必备 内容简介     Oracle 数据库中的SQL是当今市场上功能最强大的SQL实现之一,而本书全面展示了这一工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:     掌握Oracle数据库中独有的SQL强大特征;     读取并理解SQL执行计划;     快速分析并改进表现欠佳的SQL;     通过提示及配置文件等来控制执行计划;     在程序中优化查询而无需改动代码。     作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行的方向,赋予了他们不断开拓的动力。 作者简介     KAREN MORTON 研究人员、教育家及顾问,Fidelity信息服务公司的资深数据库管理员和性能调优专家。她从20世纪90年代初就开始使用Oracle,从事 Oracle的教学工作也已经超过10年的时间。她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton.blogspot.com。     KERRY OSBORNE  专注于Oracle咨询的Enkitec公司的创始人之一。从1982年开始使用Oracle(第2版)。他当过开发人员,也做过DBA,目前是 Oracle ACE总监和OakTable成员。最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。     ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用Oracle,在应用开发、大型系统实现以及性能评估方面具有丰富的经验。她是OakTable的成员,同时是Expert Oracle Practices (2010年 Apress出版)一书的合著者。     RIYAJ SHAMSUDEEN 专注于性能/数据恢复/电子商务的咨询公司OraInternals的首席数据库管理员和董事长。有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。     JARED STILL 从1994年就开始使用Oracle。他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7 致谢 -6 目录 -5 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*Plus 回顾 3 1.3.1 连接到数据库 3 1.3.2 配置SQL*Plus环境 4 1.3.3 执行命令 6 1.4 5 个核心的SQL语句 8 1.5 SELECT语句 8 1.5.1 FROM子句 9 1.5.2 WHERE子句 11 1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42 2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 3.1 全扫描访问方法 55 3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 3.2.2 索引扫描类型 68 3.2.3 索引唯一扫描 71 3.2.4 索引范围扫描 72 3.2.5 索引全扫描 74 3.2.6 索引跳跃扫描 77 3.2.7 索引快速全扫描 79 3.3 联结方法 80 3.3.1 嵌套循环联结 81 3.3.2 排序-合并联结 83 3.3.3 散列联结 84 3.3.4 笛卡儿联结 87 3.3.5 外联结 88 3.4 小结 94 第4章 SQL是关于集合的 95 4.1 以面向集合的思维方式来思考 95 4.1.1 从面向过程转变为基于集合的思维方式 96 4.1.2 面向过程vs.基于集合的思维方式:一个例子 100 4.2 集合运算 102 4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合函数 114 4.4 小结 114 第5章 关于问题 116 5.1 问出好的问题 116 5.2 提问的目的 117 5.3 问题的种类 117 5.4 关于问题的问题 119 5.5 关于数据的问题 121 5.6 建立逻辑表达式 126 5.7 小结 136 第6章 SQL执行计划 137 6.1 解释计划 137 6.1.1 使用解释计划 137 6.1.2 理解解释计划可能达不到目的的方式 143 6.1.3 阅读计划 146 6.2 执行计划 148 6.2.1 查看最近生成的SQL语句 149 6.2.2 查看相关执行计划 149 6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 170 7.1 基本的GROUP BY用法 171 7.2 HAVING子句 174 7.3 GROUP BY的“新”功能 175 7.4 GROUP BY的CUBE扩展 175 7.5 CUBE的实际应用 179 7.6 通过GROUPING()函数排除空值 185 7.7 用GROUPING()来扩展报告 186 7.8 使用GROUPING_ID()来扩展报告 187 7.9 GROUPING SETS与ROLLUP() 191 7.10 GROUP BY局限性 193 7.11 小结 196 第8章 分析函数 197 8.1 示例数据 197 8.2 分析函数剖析 198 8.3 函数列表 199 8.4 聚合函数 200 8.4.1 跨越整个分区的聚合函数 201 8.4.2 细粒度窗口声明 201 8.4.3 默认窗口声明 202 8.5 Lead和Lag 202 8.5.1 语法和排序 202 8.5.2 例1:从前一行中返回一个值 203 8.5.3 理解数据行的位移 204 8.5.4 例2:从下一行中返回一个值 204 8.6 First_value和Last_value 205 8.6.1 例子:使用First_value来计算最大值 206 8.6.2 例子:使用Last_value来计算最小值 207 8.7 其他分析函数 207 8.7.1 Nth_value(11gR2) 207 8.7.2 Rank 209 8.7.3 Dense_rank 210 8.7.4 Row_number 211 8.7.5 Ratio_to_report 211 8.7.6 Percent_rank 212 8.7.7 Percentile_cont 213 8.7.8 Percentile_disc 215 8.7.9 NTILE 215 8.7.10 Stddev 216 8.7.11 Listagg 217 8.8 性能调优 218 8.8.1 执行计划 218 8.8.2 谓语 219 8.8.3 索引 220 8.9 高级话题 221 8.9.1 动态SQL 221 8.9.2 嵌套分析函数 222 8.9.3 并行 223 8.9.4 PGA大小 224 8.10 组织行为 224 8.11 小结 224 第9章 Model子句 225 9.1 电子表格 225 9.2 通过Model子句进行跨行引用 226 9.2.1 示例数据 226 9.2.2 剖析Model子句 227 9.2.3 规则 228 9.3 位置和符号引用 229 9.3.1 位置标记 229 9.3.2 符号标记 230 9.3.3 FOR循环 231 9.4 返回更新后的行 232 9.5 求解顺序 233 9.5.1 行求解顺序 233 9.5.2 规则求解顺序 235 9.6 聚合 237 9.7 迭代 237 9.7.1 一个例子 238 9.7.2 PRESENTV与空值 239 9.8 查找表 240 9.9 空值 242 9.10 使用Model子句进行性能调优 243 9.10.1 执行计划 243 9.10.2 谓语前推 246 9.10.3 物化视图 247 9.10.4 并行 249 9.10.5 Model子句执行中的分区 250 9.10.6 索引 251 9.11 子查询因子化 252 9.12 小结 253 第10章 子查询因子化 254 10.1 标准用法 254 10.2 SQL优化 257 10.2.1 测试执行计划 257 10.2.2 跨多个执行的测试 260 10.2.3 测试查询改变的影响 263 10.2.4 寻找其他优化机会 266 10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY的功能 277 10.4.1 LEVEL伪列 278 10.4.2 SYS_CONNECT_BY_PATH函数 279 10.4.3 CONNECT_BY_ROOT运算符 281 10.4.4 CONNECT_BY_ISCYCLE伪列和NOCYCLE参数 284 10.4.5 CONNECT_BY_ISLEAF伪列 287 10.5 小结 291 第11章 半联结和反联结 292 11.1 半联结 292 11.2 半联结执行计划 300 11.3 控制半联结执行计划 305 11.3.1 使用提示控制半联结执行计划 305 11.3.2 在实例级控制半联结执行计划 308 11.4 半联结限制条件 310 11.5 半联结必要条件 312 11.6 反联结 312 11.7 反联结执行计划 317 11.8 控制反联结执行计划 326 11.8.1 使用提示控制反联结执行计划 326 11.8.2 在实例级控制反联结执行计划 327 11.9 反联结限制条件 330 11.10 反联结必要条件 333 11.11 小结 333 第12章 索引 334 12.1 理解索引 335 12.1.1 什么时候使用索引 335 12.1.2 列的选择 337 12.1.3 空值问题 338 12.2 索引结构类型 339 12.2.1 B-树索引 339 12.2.2 位图索引 340 12.2.3 索引组织表 341 12.3 分区索引 343 12.3.1 局部索引 343 12.3.2 全局索引 345 12.3.3 散列分区与范围分区 346 12.4 与应用特点相匹配的解决方案 348 12.4.1 压缩索引 348 12.4.2 基于函数的索引 350 12.4.3 反转键索引 353 12.4.4 降序索引 354 12.5 管理问题的解决方案 355 12.5.1 不可见索引 355 12.5.2 虚拟索引 356 12.5.3 位图联结索引 357 12.6 小结 359 第13章 SELECT以外的内容 360 13.1 INSERT 360 13.1.1 直接路径插入 360 13.1.2 多表插入 363 13.1.3 条件插入 364 13.1.4 DML错误日志 364 13.2 UPDATE 371 13.3 DELETE 376 13.4 MERGE 380 13.4.1 语法和用法 380 13.4.2 性能比较 383 13.5 小结 385 第14章 事务处理 386 14.1 什么是事务 386 14.2 事务的ACID属性 387 14.3 事务隔离级别 388 14.4 多版本读一致性 390 14.5 事务控制语句 391 14.5.1 Commit(提交) 391 14.5.2 Savepoint(保存点) 391 14.5.3 Rollback(回滚) 391 14.5.4 Set Transaction(设置事务) 391 14.5.5 Set Constraints(设置约束) 392 14.6 将运算分组为事务 392 14.7 订单录入模式 393 14.8 活动事务 399 14.9 使用保存点 400 14.10 序列化事务 403 14.11 隔离事务 406 14.12 自治事务 409 14.13 小结 413 第15章 测试与质量保证 415 15.1 测试用例 416 15.2 测试方法 417 15.3 单元测试 418 15.4 回归测试 422 15.5 模式修改 422 15.6 重复单元测试 425 15.7 执行计划比较 426 15.8 性能测量 432 15.9 在代码中加入性能测量 432 15.10 性能测试 436 15.11 破坏性测试 437 15.12 通过性能测量进行系统检修 439 15.13 小结 442 第16章 计划稳定性与控制 443 16.1 计划不稳定性:理解这个问题 443 16.1.1 统计信息的变化 444 16.1.2 运行环境的改变 446 16.1.3 SQL语句的改变 447 16.1.4 绑定变量窥视 448 16.2 识别执行计划的不稳定性 450 16.2.1 抓取当前所运行查询的数据 451 16.2.2 查看一条语句的性能历史 452 16.2.3 按照执行计划聚合统计信息 454 16.2.4 寻找执行计划的统计方差 454 16.2.5 在一个时间点附近检查偏差 456 16.3 执行计划控制:解决问题 458 16.3.1 调整查询结构 459 16.3.2 适当使用常量 459 16.3.3 给优化器一些提示 459 16.4 执行计划控制:不能直接访问代码 466 16.4.1 选项1:改变统计信息 467 16.4.2 选项2:改变数据库参数 469 16.4.3 选项3:增加或移除访问路径 469 16.4.4 选项4:应用基于提示的执行计划控制机制 470 16.4.5 大纲 470 16.4.6 SQL概要文件 481 16.4.7 SQL执行计划基线 496 16.4.8 基于提示的执行计划控制机制总结 502 16.5 结论 502 媒体评论     本书作者全部是OakTable的成员,且具有15~29年丰富的Oracle开发经验。在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。     ——亚马逊读者评论 精彩内容     SQL核心     凯伦?莫顿(Karen Morton)     不管你是刚开始写SQL语句还是已经写过很多年了,学会写出“好的”SQL这个过程都需要具有很扎实的SQL核心语法和概念基础知识。本章对SQL语言的核心概念及其性能做了回顾,同时还描述了一些你应该已经很熟悉的常用SQL命令。对于那些以前曾经使用过SQL并且基础知识相当牢靠的读者来说,本章就是一个简要的复习,让你为后面更详细的SQL论述做好准备。如果你是一位SQL新人,你可能想要先阅读Beginning Oracle SQL这本书以确保掌握SQL的基础。不管是哪种情况,第1章的目的就是通过对5个核心SQL语句的快速浏览来衡量一下你的SQL水平,同时还概述了我们用来执行SQL语句的工具:SQL*Plus。     1.1  SQL语言     SQL语言最早是IBM公司于20世纪70年代开发出来的,称为结构化英文查询语言,简称为SEQUEL。该语言是基于E.F.Codd在1969年提出的关系型数据库管理系统(RDBMS)的。后来因为商标的纠纷,其简称又进一步缩写为SQL。1986年和1987年,ANSI(美国国家标准化组织)和ISO(国际标准化组织)先后将SQL语言采纳为标准语言。而人们并不熟悉的是,ANSI官方曾将SQL语言的读音确定为“S-Q-L”。绝大多数人,包括我本人,都还在使用“sequel”的读音,只是因为这样读起来更顺口一些。     SQL的目的就是简单地提供一个到数据库的接口,在本书指的是Oracle数据库。每一条SQL语句对于数据库来说就是一条命令或指令。SQL与其他编程语言(如C或Java)的区别就在于它是要处理数据集合而不是一行一行的数据。语言本身也不需要你提供如何导航到数据的指令——这是在后台透明地进行的。但你将在后面的章节中看到,如果想在Oracle中写出高效的SQL语句,了解数据及其在数据库中的存储方式与存储位置是很重要的。     由于不同的供应商(例如甲骨文、IBM和微软)实现SQL核心功能的机制相差无几,所以基于某一种数据库所学的技巧同样可以应用到其他类型的数据库上。你基本上可以利用同样的SQL语句来进行数据的查询、插入、更新和删除,以及创建、修改和删除对象,而不必管数据库的供应商是哪家。     尽管SQL是各种关系型数据库管理系统的标准语言,但实际上它并不一定是关系型的。在本书后面我将就这一点稍作扩展。如果想要了解更多的细节,我推荐大家阅读C.J.Date的SQL and Relational Theory一书。需要铭记于心的一点是SQL语言并不总是严格遵守关系模型的——它根本就没有实现关系模型的某些要素,同时还不恰当地实现了一些要素。事实上,既然SQL是基于关系模型的,那么要想写出尽可能正确高效的SQL语句,你不仅必须要理解SQL语言,还要理解关系模型。     1.2  数据库的接口     多年以来人们开发出多种途径来传递SQL语句到数据库并获得结果。Oracle数据库的本地接口界面是Oracle调用界面(OCI)。OCI将由Oracle内核传送而来的查询语句发送到数据库。当使用某种Oracle工具如SQL*Plus或者SQL Developer时,你都在使用OCI。其他的Oracle工具如SQL*Loader、数据泵(Data Pump)以及Real Application Testing (RAT)既使用OCI,也可以使用语言特定的接口,如Oracle JDBC-OCI、ODP.Net、Oracle预编译器、Oracle ODBC以及Oracle C++调用接口(OCCI)驱动器。     当使用编程语言(如COBOL或C语言)时,你所写的语句被称为嵌入式的SQL语句并且在应用程序编译之前会由SQL预处理器进行预处理。代码清单1-1是一段可以在C/C++程序块中使用的SQL语句的例子。     代码清单1-1  C/C++程序块中所嵌入的SQL语句     其他工具,例如SQL*Plus和SQL Developer,都是交互式的工具。你输入并执行命令,然后获得相应的输出。交互式工具并不需要在运行代码前先精确编译,你只需要输入想要执行的命令即可。代码清单1-2是一段使用SQL*Plus执行语句的例子。     代码清单1-2  使用SQL*Plus执行SQL语句     在本书中,为了保持一致性我们所用的示例代码清单都使用SQL*Plus工具,但需要记住的是,不管你是用什么方法或工具来输入和执行SQL语句,所有的事情最后都要通过OCI来传递到数据库。这里的主旨就是不管你所使用的是什么工具,其本地接口都是一样的。     1.3  SQL*Plus回顾     SQL*Plus是一个不管采用哪个安装平台(Windows或Unix)都会提供的命令行工具。它是一个用来输入和执行SQL语句并显示输出结果的纯文本环境。用该工具可以直接输入、编辑命令,可以一条条地保存和执行命令或者通过脚本文件来进行,然后将输出结果以很精美格式的报表输出。要启动SQL*Plus你只需要在主机的命令提示符后敲入sqlplus即可。     1.3.1  连接到数据库     有多种方法可以通过SQL*Plus连接数据库。然而在连接之前,你还需要在$ORACLE_HOME/ network/admin/tnsnames.ora这个文件中登记想要连接的数据库。有两种通常使用的方法,或者如代码清单1-3所示那样在启动SQL*Plus时提供连接信息,或者如代码清单1-4所示那样在启动SQL*Plus以后使用connect命令。     代码清单1-3  通过窗口命令提示符连接到SQL*Plus     如果想要启动SQL*Plus而又不显示登录到数据库后的提示,可以在启动SQL*Plus时使用/nolog选项。     代码清单1-4  通过SQL>提示符连接SQL*Plus并登录到数据库     1.3.2  配置SQL*Plus环境     SQL*Plus有很多的命令可以让你来定制工作环境和显示选项。代码清单1-5所示是在SQL>提示符下输入help index命令后显示出来的可用的命令。     代码清单1-5  SQL*Plus命令列表     set命令是用来定制工作环境的最基本的命令。代码清单1-6为set命令的帮助文本。     代码清单1-6  SQL*Plus的SET命令     有了上面这些可用命令,你就能够很轻松地定制最适合你的运行环境了。但有一点要铭记于心的就是当你退出或关闭SQL*Plus的时候,这些设置命令就不再被保留了。为了避免每次使用SQL*Plus时都重新敲入一遍这些设置命令,你可以创建一个login.sql文件。事实上每次启动SQL*Plus的时候它都会默认去读两个文件。第一个是$ORACLE_HOME/sqlplus/admin目录下的glogin.sql文件。如果找到了这个文件,它就会被读进来,文件中的命令语句也会被执行。这样就可以把那些定制你的会话体验的SQL*Plus命令和SQL语句保存起来。     在读取glogin.sql文件以后,SQL*Plus会进一步寻找login.sql文件。这个文件必须在SQL*Plus的启动文件夹中或者包含在环境变量SQLPATH所指向的文件夹路径中。在login.sql文件中的所有命令优先级都比glogin.sql文件中的命令高。从10g开始,Oracle在每次你启动SQL*Plus或者从SQL*Plus里执行connect命令的时候都会同时去读取glogin.sql和login.sql这两个文件。在Oracle 10g之前,login.sql脚本文件只有在SQL*Plus启动的时候才会被执行。代码清单1-7是一个常见的login.sql文件内容。     代码清单1-7  一个常见的login.sql文件     注意这里在SET SQLPROMPT中使用的变量_user和_connect_identifier。它们是预定义变量的两个示例。你可以在login.sql文件中或者任何你创建的脚本文件中使用下面这些预定义变量:     ·_connect_identifier     ·_date     ·_editor(这个变量指定了当你使用edit命令的时候启动哪个编辑器)     ·_o_version     ·_o_release     ·_privilege     ·_sqlplus_release     ·_user     1.3.3  执行命令     有两种命令可以在SQL*Plus中执行:SQL语句和SQL*Plus命令。代码清单1-5和代码清单1-6中所列出的SQL*Plus命令对于SQL*Plus来说是特有的命令,可以用来定制运行环境并且可以运行SQL*Plus特有的命令,例如DESCRIBE和CONNECT。要想执行一个SQL*Plus命令,你只需在命令提示符后输入该命令然后敲回车,命令会自动被执行。另一方面,如果要执行SQL语句,就必须使用一个特定字符来表明你想要执行输入的语句,分号(;)或者斜线(/)都可以。使用分号的话可以直接放在输入命令的后面或者放在接下来的空行中,而斜线则必须放在接下来的空行中才可以被识别。代码清单1-8展示了如何使用这两种符号。     代码清单1-8  执行字符的用法     注意第5个在语句最后面加了一个斜线(/)的例子。光标移动到了下一行而不是立即执行语句命令。接下来,如果你再按一下回车键,语句就会被放入SQL*Plus的缓冲器中,但是也不执行。如果想要查看SQL*Plus缓冲器中的内容,可以使用list命令(也可以简写为l)。接下来如果你想在缓冲器中通过使用斜线(/)来执行语句[尽管斜线(/)命令本来就是这样来用的]在这里也将会返回一个错误。这是因为你最初在SQL语句的结尾敲入了一个斜线(/),而斜线(/)并不是一个有效的SQL命令,从而在语句想要执行的时候报错。     另外一种执行命令的方法是把命令放到一个文件中。你可以在SQL*Plus之外直接用文本编辑器生成这些文件,也可以在SQL*Plus中使用EDIT命令来直接调用编辑器。如果已经有了一个文件,EDIT命令可以打开这个文件,如果没有的话就会创建新的文件。文件必须放在默认文件夹中,否则你必须指定文件的全路径。想要设定所选择的编辑器,你只需要利用命令define_ editor='//myeditor.exe'来设置预定义变量_editor。具有.sql扩展名的文件在执行的时候不必敲入扩展名,通过@或START命令都可以执行。代码清单1-9中列出了这两个命令的用法。     代码清单1-9  执行.sql脚本文件     SQL*Plus具有很多特性和选项,以致于多得在这里不能一一列举。就本书需要而言,这种概述就已经足够了。但是,Oracle文档对SQL*Plus的用法给出了指导,而且很多的书,比如Beginning Oracle SQL,都对SQL*Plus作了更为深入的阐述,如果感兴趣你可以参考。     1.4  5个核心的SQL语句     SQL语言有很多不同的语句,但在整个职业生涯中,你可能只会用到其中很少的一部分。不过你所使用的几乎其他任何产品不也是这样的吗?据说有一个统计结果是,绝大多数人都仅使用了他们常用的软件产品或编程语言所有功能的20%甚至更少。我不知道这个统计真实与否,但以我的经验来看,这似乎是很准确的。我发现同样的基本SQL语句格式在大多数应用中使用了将近20年了。极少数的人使用过SQL提供的所有功能——即使对于那些他们确实经常使用的功能也常常用得不是很恰当。显而易见,我们不可能覆盖SQL语言的所有语句以及它们的选项。本书的目的在于让你能够深入理解那些最常用的SQL语句并帮助你更高效地使用它们。     在本书中,我们将重点讨论5个最常用的SQL语句,它们分别为SELECT、INSERT、UPDATE、DELETE以及MERGE。尽管这些核心语句都将逐个讲解,但重中之重还是SELECT语句。将这5个语句用好了将会为你在日常工作中用好SQL语言打下坚实的基础。     1.5  SELECT语句     SELECT语句用来从一个或多个表中或者其他数据库对象中提取数据。你应该已经很熟悉SELECT语句的基础知识了,所以我将不再从一个初学者的角度来介绍SELECT语句,而是首先回顾一下SELECT语句的执行逻辑。对于如何来写一个基本的SELECT语句你应该已经学习过了,但为了培养基本的思维模式,你要一直写出符合语法规则的高效SQL语句,你需要理解SQL语句是如何执行的。     一个查询语句在逻辑上的处理方式可能会与实际物理处理过程大相径庭。Oracle基于查询成本的优化器(cost-based optimizer , CBO)用来产生实际的执行计划。我们在后面的章节中将会讲解优化器是干什么的,如何来实现其功能的以及为什么要进行优化。目前,我们需要关心的是优化器将会决定如何访问表、按照什么样的顺序来处理它们,以及如何将多个表联结起来及如何使用筛选器。查询的处理在逻辑上是按照特定的顺序进行的,但是,优化器所选择的物理执行计划可能会按照完全不同的顺序来实际执行这些步骤。代码清单1-10是一段包含SELECT语句的主要子句的查询片段,在其中标出了每一个子句的逻辑处理顺序。     代码清单1-10  查询语句的逻辑处理顺序     你应该立刻注意到SQL有别于其他编程语言的一点在于首先处理的并不是写在第一行的语句(SELECT语句),而是FROM子句。注意在这个代码清单中我给出了两个不同的FROM子句。标记为1.1的那个FROM子句表示的是当使用ANSI语法时的不同。我们可以把处理过程中的每一个步骤想象为生成一个临时的数据集。随着每个处理步骤的进行,这个数据集被不断地操作直到生成最终的处理结果。查询返回给调用者的就是这个最终结果数据集。     为了更详细地了解SELECT语句的每个部分,你可以参考代码清单1-11所示的查询语句,该语句返回的结果集为下订单超过4次的女顾客的列表。     代码清单1-11  下订单超过4次的女顾客查询语句     1.5.1  FROM子句     FROM子句列出了所查询数据的源对象。这个子句可以包含表、视图、物化视图、分区或子分区,或者你可以建立一个子查询来生成子对象。如果使用了多个源对象,其逻辑处理阶段也将会应用到每一个联结类型以及谓词ON(如步骤1.1所示)。在本书后面的章节中你将会进一步了解联结类型的更多细节,但注意在处理联结语句的时候是按照下面的顺序来进行的:     (1) 交叉联结,也称为笛卡儿乘积;     (2) 内联结;     (3) 外联结。     在代码清单1-11所示的查询例子中,FROM子句列出了两张表:customers和orders,通过customer_id列来联结。因此,当处理这一信息时,FROM子句所生成的初始数据集将会包含这两张表中customer_id相匹配的行。在本例中结果集将会包含105行。为了验证这一点,只要执行例子中的前4行,如代码清单1-12所示。     代码清单1-12  仅通过FROM子句的部分查询语句的执行     注意 为了使之很好地适应页面我手工调整了输出结果,实际输出结果在页面上超过105行。     1.5.2  WHERE子句     WHERE子句提供了一种方法,可以按照条件来限制查询最终返回结果集的行数。每个条件或者谓语都是以两个值或表达式相比较的形式出现的。比较的结果要么是匹配(值为TRUE)要么是不匹配(值为FALSE)。如果比较的结果是FALSE,那么相应的行不会被包含在最终结果集中。     这里我需要稍微偏离一下主题,来谈一谈与这一步相关的SQL中的一个重要方面。事实上,SQL中逻辑比较的可能结果是TRUE、FALSE以及未知。当其中包含空值(null)的时候比较的结果就会是未知。空值与任何值比较或者用在表达式中都会得到空值,或者是未知。一个空值代表一个相应值的缺失,并且可能因为SQL语言中的不同部分对空值的处理不同而令人费解。关于空值是如何影响SQL语句执行的话题将会贯穿本书,但在这里我不得不先提及一下这个话题。我之前所说的还是基本正确的,一个比较的返回值将会是TRUE或者FALSE。你会发现当进行筛选的比较条件中包含空值的时候,将作为FALSE来对待。     在我们的例子中,只有一个将结果限定为下了订单的女性消费者的谓语。如果你查看FROM子句执行之后的中间结果(见代码清单1-12),你会发现105行中仅有31行是由女性消费者所下的订单(gender = 'F')。因此,在应用了WHERE子句以后,中间结果集将从105行减少到31行。     应用WHERE子句以后得到了更精确的结果集。注意,在这里使用的是“精确的结果集”。我的意思是说现在已经得到了能够满足你查询需求的数据行。其他子句(GROUP BY, HAVING)也许可以用来聚合并且进一步限制调用程序会接收到的最终的结果集,但需要注意的很重要的一点是,目前已经得到了查询计算最终结果所需的所有数据。     WHERE子句的目的是限制或者减小结果集。你所使用的限制条件越少,最终返回的结果集中包含的数据就会越多。你需要返回的数据越多,执行查询的时间也就越长。     1.5.3  GROUP BY子句     GROUP BY子句将执行FROM和WHERE子句后得到的经过筛选后的结果集进行聚合。查询出来的结果按照GROUP BY子句中列出的表达式进行分组,来为每一个分组得出一行汇总结果。你可以按照FROM子句中所列出对象的任意字段进行分组,即使你并不想在输出结果列表中显示该列。相反,Select列表中的任何非聚合字段都必须包括在GROUP BY表达式中。     GROUP BY子句中还可以包含两个附加的运算:ROLLUP 和CUBE。ROLLUP运算用来产生部分求和值,CUBE运算用来求得交互分类值。当你使用这两种运算中任意一个的时候,你将会得到不止一行的汇总信息。在第7章中将会对这两个运算进行更详细的讨论。     在示例查询中,需要按照customer_id来进行分组。这就意味着对于每一个唯一的customer_id只会返回一行值。在WHERE子句执行后所得到的代表下订单的女性消费者的31行订单中,有11个独特的customer_id值,如代码清单1-13所示。     代码清单1-13  截至GROUP BY子句的部分查询执行     你会发现查询的结果是经过分组的,但并没有排序。表面上看结果好像是按照order_ct字段排序的,但这仅仅是个巧合而不是确定的行为。需要记住的很重要的一点是:GROUP BY子句并不确定结果数据的排序。如果你需要结果按照特定的顺序排列,则必须指定一个order by子句。     1.5.4  HAVING子句     HAVING子句将分组汇总后的查询结果限定为只有该子句中的条件为真的数据行。除非你使用HAVING子句,否则将返回所有的汇总行。事实上,GROUP BY子句和HAVING子句的位置是可以互换的,谁先谁后都无关紧要。但是,似乎在编码中将GROUP BY子句放在前面更有意义一些,因为GROUP BY子句在逻辑上是先执行的。从本质上来说,HAVING子句是在GROUP BY子句执行后用来筛选汇总值的第二个WHERE子句。     在我们的查询例子中,HAVING子句HAVING COUNT(o.order_id) > 4,将分组数据从11行减少到2行。这一点你可以通过查看GROUP BY子句应用后返回的结果行来确认,如代码清单1-13所示。注意仅有146和147号消费者所下的订单数超过4次。这样就产生了组成最终结果集的两行数据。     1.5.5  SELECT列表     SELECT列表列出查询的返回最终结果集中需要显示哪些列。这些列可以是数据表中一个实际的列、一个表达式,或者甚至是一个SELECT语句的结果,如代码清单1-14所示。     代码清单1-14  展现SELECT列表各种可能情况的查询实例     SQL> select.customer_id, c.cust_first_name||''||c.cust_last_name,     .     当使用另外一个SELECT语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值。这种类型的子查询被称为标量子查询。尽管这可能是一个非常有用的语法,但需要牢记于心的是标量查询在结果集中的每一行结果产生时都要执行一遍。在某些情况下可以进行优化以减少标量子查询的重复执行,但更糟糕的场景是每一行都需要标量子查询执行。你可以想象如果你的结果集中有几千行甚至上百万行数据的时候所需要付出的查询代价!在后面的章节中我们还将回顾标量子查询并讨论如何更好地来使用它们。     在SELECT列表中你还有可能用到的一个选项是DISTINCT子句。在例子中并没有使用它,但我想要简要地提及一下。DISTINCT子句用来在其他子句执行完毕以后从结果集中去除重复的行。     SELECT列表执行完以后,你就得到了最终的查询结果集。所剩的唯一需要做的事情,如果包含了的话,就是将查询结果集按照所需的顺序排序。     1.5.6  ORDER BY子句     ORDER BY子句用来对查询最终返回的结果集进行排序。在本例中,需要按照orders_ct和customer_id进行排序。orders_ct这一列是通过GROUP BY子句中的COUNT聚合函数计算得到的值。如代码清单1-13中所示,有两个消费者的订单超过4个。由于这两个消费者的订单数都是5份,orders_ct这一列的值是相同的,所以要由第二个排序列来确定最终结果的显示顺序。如代码清单1-15中所示,该查询的最终经过排序的输出结果是按照customer_id排序的两行数据集。     代码清单1-15  示例查询的最终输出     当输出结果需要排序的时候,Oracle必须在其他所有子句都执行完之后按照指定的顺序对最终结果集进行排序。需要排序的数据量大小是非常重要的。我这里所说的大小是指结果集中所包含的总字节数。你可以通过用行数乘以每一行的字节数来估计数据集的大小。每行所包含的字节数通过将选择列表中包含的每一列的平均长度相加来确定。     上面的查询实例在选择列表中仅需要列出customer_id 和orders_ct两列的值。我们可以估算每一行输出值的字节数为10。在第6章中我将阐述从哪里能找到优化器所估计的值。因此,如果我们在结果集中只有两行数据,排序的大小实际上是很小的,大约20字节。请记住这仅仅是估算,但这样的估算也是很重要的。     较小的排序会完全在内存中来实现,而较大的排序将不得不使用临时磁盘空间来完成。如你可能推断的那样,在内存中完成的排序比必须使用磁盘的排序要快。因此,当优化器估算排序数据的影响时,它必须要考虑排序数据集的大小,以此来调整如何能够以最有效的方法来获得查询的结果。一般来说,排序是查询过程中开销相当大的一个处理步骤,尤其是当返回结果集很大的时候。     1.6  INSERT语句     INSERT语句用来向表、分区或视图中添加行。可以向单表或者多个表方法中添加数据行。单表插入将会向一个表中插入一行数据,这行数据可以显式地列出插入值也可以通过一个子查询来获取。多表插入将会向一个或多个表中插入行,并且会通过子查询获取值来计算所插入行的值。     1.6.1  单表插入     代码清单1-16中的第一个例子阐明了使用values子句实现的单表插入。每一列的值都显式地输入。如果你要插入表中所定义的所有列的值,那么列的列表是可选的。但是,如果你只想提供部分列的值,则必须在列的列表中指明所需的列名。好的做法是不管是不是需要插入所有列的值,都把所有列的列表列出来。这样做就像该语句的自述文件一样,并且也可以减少将来别人要插入一个新列到表中的时候可能出现的错误。     代码清单1-16  单表插入     第二个例子阐述了通过子查询来实现插入。这是插入数据行的一个非常灵活的选项。所写的子查询可以返回一行或多行数据。返回的每一行都会用来生成需要插入的新行的列值。根据你的需要这个子查询可以很简单也可以很复杂。在本例中,我们使用子查询实现了在现有薪水的基础上为每一位员工发放10%奖金的计算。事实上奖金表包含4列,但在这个插入中我们只列出了3个字段。comm这一列在子查询中并没有占据一列并且我们也没有将它包括在列表中。因为我们没有包含这一列,它的值将会是null。注意如果comm列具有非空约束,那么可能已返回一个约束错误,语句的执行也已失败。     1.6.2  多表插入     代码清单1-17所示的多表插入的例子阐明了一个子查询返回的数据行是如何被用来插入多个表中的。我们从3个表开始:small_customers、medium_customers以及large_customers。我们想要按照每位消费者所下订单的总金额来将数据分别插入这些表。子查询将每一位消费者的order_total列求和来确定该消费者的消费金额是小(所有订单的累加金额小于10 000美元)、中等(介于10 000美元与99 999.99美元之间)还是大(大于等于100 000美元),然后按照条件将这些行插入对应的表中。     代码清单1-17  多表插入     注意INSERT关键字后面ALL子句的使用。当指定了ALL子句的时候,这个语句就会执行无条件的多表插入。也就意味着每一个WHEN子句按照子查询所返回的每一行来确定值而不管前一个条件的输出结果是什么。因此,你需要注意如何来指定每个条件。例如,如果我使用WHEN sum_orders < 100 000这个条件而不是像上面一样列出范围,插入medium_customers表中的行有可能也会插入small_customers表中。     你需要指明FIRST选项来实现每一个WHEN子句按照其出现在语句中的顺序进行评估,并且对于一个给定的子查询行跳过接下来的WHEN子句评估。关键在于要记住哪一个选项能够更好地满足你的需要,ALL还是FIRST,然后使用最适合的选项。     1.7  UPDATE语句     UPDATE语句的作用是改变表中原有行的列值。这个语句的语法由3部分组成:UPDATE、SET和WHERE。UPDATE子句用来指定要更新的表,SET子句用来指明哪些列改变了以及调整的值,WHERE子句用来按条件筛选需要更新的行。WHERE子句是可选的,如果忽略了这个子句的话,更新操作将针对指定表中的所有行进行。     代码清单1-18列出了几种UPDATE语句的不同写法。首先,我建立了一个employees表的副本,名称为employees2,然后我将执行几个完成基本相同任务的不同更新操作:将90部门的员工工资增加10%。在例5中,commission_pct这一列也进行了更新。下面就是采用的不同方法。     例1:使用表达式更新一个单列的值。     例2:通过子查询更新一个单列的值。     例3:通过在WHERE子句中使用子查询确定要更新的数据行来更新单列的值。     例4:通过使用SELECT语句定义表及列的值来更新表。     例5:通过子查询更新多列。     代码清单1-18  UPDATE语句的例子     1.8  DELETE语句     DELETE语句用来从表中移除数据行。该语句的语法结构由3部分组成:DELETE、FROM和WHERE。DELETE关键字是单独列出的。除非你决定使用我们后面将会讨论到的提示(hint),没有其他选项与DELETE关键字相结合。FROM子句用来指定要从哪个表中删除数据行。如代码清单1-19中的例子所示,这个表可以直接指定也可以通过子查询来确定。WHERE子句提供筛选条件有助于确定哪些行是要删除的。如果忽略了WHERE子句,删除操作将删除指定表中的所有数据行。     代码清单1-19展示出了DELETE语句的几种不同写法。注意,在这些例子中我使用了代码清单1-18中创建的employees2表。下面你将看到的就是这些不同的删除方法。     例1:使用WHERE子句中的筛选条件来从指定表中删除行。     例2:使用FROM子句中的子查询来删除行。     例3:使用WHERE子句中的子查询来从指定表中删除行。     代码清单1-19  DELETE语句的例子     1.9  MERGE语句     MERGE语句具有按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或者向表中插入行两方面的能力。它最经常被用在数据仓库中来移动大量的数据,但它的应用不仅限于数据仓库环境下。这个语句提供的一个很大的附加值在于你可以很方便地把多个操作结合成一个。这就使你可以避免使用多个INSERT、UPDATE以及DELETE语句。并且,在本书后面的内容中你将看到,如果你避免去做那些不是必须做的事情,响应时间可能得到相应的改善。     MERGE语句的语法是:     为了说明MERGE语句的用法,代码清单1-20展示出了如何建立一个测试表,然后恰当地利用MERGE条件来向表中插入或更新行。     代码清单1-20  MERGE语句例子     MERGE语句完成了下面这些事情。     ·插入了两行(员工id 106和107)。     ·更新了一行(员工id 105)。     ·删除了一行(员工id 103)。     ·一行保持不变(员工id 104)。     如果没有MERGE语句,你必须最少写3条不同的语句来完成同样的事情。     1.10  小结     正如你可以从到目前为止的例子中看出的,SQL语言提供了很多不同的选择来得到同样的结果集。你可能还注意到了一点就是这5个核心的SQL语句都可以使用类似的构造,例如子查询。关键是需要搞清楚在各种不同的使用场景下哪种构造是最高效的。我们将在本书后面的内容中阐述如何做到这一点。     如果你对本章的例子的理解有任何困难,请一定花点时间复习Beginning Oracle SQL或者Oracle文档中的SQL Reference Guide。在本书中接下来的部分我们假设你已经很好地理解了5个核心SQL语句的基本构造:SELECT、INSERT、UPDATE、DELETE和MERGE。
2022-05-19 17:14:43 223KB Oracle SQL 高级编程 随书源代码
1