商家名称 | 信用等级 | 购买信息 | 订购本书 |
MySQL技术内幕:SQL编程 [平装] | |||
MySQL技术内幕:SQL编程 [平装] |
《MySQL技术内幕:SQL编程》系统深入地讲解了MySQL数据库中SQL编程的各种方法、技巧和最佳实践,推荐DBA和开发人员参阅!畅销书《MySQL技术内幕:InnoDB存储引擎》姊妹篇,揭示SQL编程的奥秘,演绎SQL编程之美资深MySQL专家亲自执笔,多个技术社区和多位数据库专家联袂推荐。
David是ChinaUnix社区资深的MySQL版主,几年来,在论坛里热心地为广大MySQL DBA和开发者解答了很多问题,非常受欢迎。David是MySQL领域的专家,不仅多年来一直在国内的大型企业从事MySQL相关的工作,而且还为MySQL编写了许多开源工具和性能扩展补丁,对MySQL数据库的使用(管理与开发)和原理都非常精通。本书是David多年工作经验的结晶,系统深入地揭示了MySQL中SQL编程的方方面面,能为我们解决复杂的MySQL数据库问题提供很好的指导。强烈推荐!
——ChinaUnix社区&ITpub社区
本书的内容是告诉你如何使用SQL语言指挥数据库这个“庞然大物”。人与人的沟通需要技巧,与数据库沟通更需要技巧,而一切沟通都需要先从熟悉语言开始。作者沉迷于数据库的世界多年,有天赋,也肯下苦功,是我见过的最优秀的DBA之一。他熟知SQL的各种语法技巧,结合日常工作中的经验和领悟,写出了这本“内幕”。相信我,不管你是需要一本SQL查询手册,还是想要获得更多SQL编程的经验技巧,本书都不可不读。
——顾懿 久游网首席运营官
我是几年前在某个技术社区中认识David的,记得他总能用深入原理性的阐述来解答网友的疑惑。从中可以看出他对MySQL尤其是InnoDB引擎的理解之深,他的上一本著作《MySQL技术内幕:InnoDB存储引擎》推出后广获好评,填补了业界系统化讲解InnoDB引擎原理的空白。本书详细讲解了子查询、表连接、聚合、事务、索引等SQL编程各环节所涉及的内容,全面揭示了MySQL中SQL编程的奥妙,用事实证明了MySQL也是可以处理复杂SQL查询的,而非只是个玩具。在这里,我向开发人员、DBA以及所有对MySQL有兴趣的读者推荐本书,将使你受益匪浅。相信它将再次掀起习MySQL的热潮。
——叶金荣 ChinaUnix社区 MySQL版主
无论是与MySQL数据库相关的开发工作,还是MySQL数据库的管理与维护,SQL语言都发挥着极为重要的作用。所以,对于数据管理人员(DBA)和开发人员来说,掌握SQL编程技巧是全面了解数据库系统的必备条件之一。本书结合MySQL的历史、辅助工具、内部工作机制等多个角度详细讲解了SQL编程的方法,展示了SQL在MySQL数据库编程方面(尤其是性能方面)的高级技巧。对于想全面深入地学习SQL编程和MySQL数据库的读者而言,本书不可多得。
——郭鹏 《Cassandra实战》作者、专注于Hadoop&NoSQL技术研究
姜承尧(DavidJiang),资深MySQL数据库专家,MySQL开源分支版本InnoSQL的创始人,独立数据库咨询顾问。不仅擅长于数据库的管理和维护,还擅长于数据库的开发,同时一直致力于MySQL数据库底层实现原理的研究和探索,对高性能数据库和数据仓库也有深刻而独到的理解。目前就职于网易研究院,担任后台技术中心技术经理一职,从事MySQL数据库底层以及云的相关的开发工作。曾领导并参与了多个大型核心数据库应用的设计、实施、管理和维护,实战经验非常丰富。活跃于开源数据库和开源软件领域,是著名开源社区ChinaUnix MySQL版块的版主,热衷于分享MySQL数据库的各种成功应用实践。
序
前言
第1章 SQL编程/1
1.1 MySQL数据库/2
1.1.1 MySQL数据库历史/2
1.1.2 MySQL数据库的分支版本/4
1.2 SQL编程/5
1.3 数据库的应用类型/7
1.3.1 OLTP/7
1.3.2 OLAP/8
1.3.3 OLTP与OLAP的比较/9
1.3.4 MySQL存储引擎及其面向的数据库应用/10
1.4 图形化的SQL查询分析器/12
1.4.1 MySQL Workbench/12
1.4.2 Toad for MySQL/12
1.4.3 iMySQL-Front/13
1.5 小结/15
第2章 数据类型/16
2.1 类型属性/17
2.1.1 UNSIGNED/17
2.1.2 ZEROFILL/20
2.2 SQL_MODE设置/21
2.3 日期和时间类型/26
2.3.1 DATETIME和 DATE/26
2.3.2 TIMESTAMP/28
2.3.3 YEAR和TIME/30
2.3.4 与日期和时间相关的函数/31
2.4 关于日期的经典SQL编程问题/34
2.4.1 生日问题/34
2.4.2 重叠问题/37
2.4.3 星期数的问题/48
2.5 数字类型/53
2.5.1 整型/53
2.5.2 浮点型(非精确类型)/54
2.5.3 高精度类型/54
2.5.4 位类型/55
2.6 关于数字的经典SQL编程问题/56
2.6.1 数字辅助表/56
2.6.2 连续范围问题/58
2.7 字符类型/60
2.7.1 字符集/60
2.7.2 排序规则/64
2.7.3 CHAR和VARCHAR/68
2.7.4 BINARY和VARBINARY/70
2.7.5 BLOB和TEXT/72
2.7.6 ENUM和SET类型/73
2.8 小结/75
第3章 查询处理/76
3.1 逻辑查询处理/77
3.1.1 执行笛卡儿积/79
3.1.2 应用ON过滤器/80
3.1.3 添加外部行/83
3.1.4 应用WHERE过滤器/84
3.1.5 分组/85
3.1.6 应用ROLLUP或CUBE/86
3.1.7 应用HAVING过滤器/86
3.1.8 处理SELECT列表/87
3.1.9 应用DISTINCT子句/87
3.1.10 应用ORDER BY子句/88
3.1.11 LIMIT子句/92
3.2 物理查询处理/93
3.3 小结/95
第4章 子查询/96
4.1 子查询概述/97
4.1.1 子查询的优点和限制/97
4.1.2 使用子查询进行比较/97
4.1.3 使用ANY、IN和SOME进行子查询/98
4.1.4 使用ALL进行子查询/99
4.2 独立子查询/99
4.3 相关子查询/105
4.4 EXISTS谓词/109
4.4.1 EXISTS /109
4.4.2 NOT EXISTS/111
4.5 派生表/113
4.6 子查询可以解决的经典问题/114
4.6.1 行号/114
4.6.2 分区/118
4.6.3 最小缺失值问题/121
4.6.4 缺失范围和连续范围/122
4.7 MariaDB对SEMI JOIN的优化/126
4.7.1 概述/126
4.7.2 Table Pullout优化/127
4.7.3 Duplicate Weedout 优化/128
4.7.4 Materialization优化/129
4.8 小结/130
第5章 联接与集合操作/132
5.1 联接查询/133
5.1.1 新旧查询语法/133
5.1.2 CROSS JOIN/134
5.1.3 INNER JOIN/137
5.1.4 OUTER JOIN/138
5.1.5 NATURAL JOIN/141
5.1.6 STRAIGHT_JOIN/141
5.2 其他联接分类/142
5.2.1 SELF JOIN/143
5.2.2 NONEQUI JOIN/144
5.2.3 SEMI JOIN和ANTI SEMI JOIN/145
5.3 多表联接/146
5.4 滑动订单问题/148
5.5 联接算法/150
5.5.1 Simple Nested-Loops Join算法/150
5.5.2 Block Nested-Loops Join算法/155
5.5.3 Batched Key Access Join算法/158
5.5.4 Classic Hash Join算法/161
5.6 集合操作/163
5.6.1 集合操作的概述/163
5.6.2 UNION DISTINCT和UNION ALL/165
5.6.3 EXCEPT/167
5.6.4 INTERSECT/170
5.7 小结/171
第6章 聚合和旋转操作/172
6.1 聚合 /173
6.1.1 聚合函数/173
6.1.2 聚合的算法/174
6.2 附加属性聚合/176
6.3 连续聚合/178
6.3.1 累积聚合/179
6.3.2 滑动聚合/183
6.3.3 年初至今聚合/184
6.4 Pivoting/185
6.4.1 开放架构/185
6.4.2 关系除法/187
6.4.3 格式化聚合数据/189
6.5 Unpivoting/191
6.6 CUBE 和 ROLLUP/193
6.6.1 ROLLUP/193
6.6.2 CUBE/196
6.7 小结/197
第7章 游标/198
7.1 面向集合与面向过程的开发/199
7.2 游标的使用/199
7.3 游标的开销/200
7.4 使用游标解决问题/202
7.4.1 游标的性能分析/202
7.4.2 连续聚合/203
7.4.3 最大会话数/206
7.5 小结/210
第8章 事务编程/211
8.1 事务概述/212
8.2 事务的分类/214
8.3 事务控制语句/219
8.4 隐式提交的SQL语句/224
8.5 事务的隔离级别/225
8.6 分布式事务编程/229
8.7 不好的事务编程习惯/234
8.7.1 在循环中提交/234
8.7.2 使用自动提交/236
8.7.3 使用自动回滚/236
8.8 长事务/239
8.9 小结/240
第9章 索引/242
9.1 缓冲池、顺序读取与随机读取/243
9.2 数据结构与算法/246
9.2.1 二分查找法/246
9.2.2 二叉查找树和平衡二叉树/247
9.3 B+树/249
9.3.1 B+树的插入操作/250
9.3.2 B+树的删除操作/252
9.4 B+树索引/253
9.4.1 InnoDB B+树索引/254
9.4.2 MyISAM B+树索引/256
9.5 Cardinality/256
9.5.1 什么是Cardinality/256
9.5.2 InnoDB存储引擎怎样统计Cardinality/257
9.6 B+树索引的使用/259
9.6.1 不同应用中B+树索引的使用/259
9.6.2 联合索引/260
9.6.3 覆盖索引/262
9.6.4 优化器选择不使用索引的情况/263
9.6.5 INDEX HINT/265
9.7 Multi-Range Read/267
9.8 Index Condition Pushdown/269
9.9 T树索引/271
9.9.1 T树概述/271
9.9.2 T树的查找、插入和删除操作/272
9.9.3 T树的旋转/273
9.10 哈希索引/276
9.10.1 散列表/276
9.10.2 InnoDB存储引擎中的散列算法/278
9.10.3 自适应哈希索引/278
9.11 小结/279
第10章 分区/280
10.1 分区概述/281
10.2 分区类型/283
10.2.1 RANGE分区/283
10.2.2 LIST分区/289
10.2.3 HASH分区/291
10.2.4 KEY分区/293
10.2.5 COLUMNS分区/293
10.3 子分区/295
10.4 分区中的NULL值/298
10.5 分区和性能/301
10.6 在表和分区间交换数据/305
10.7 小结/307
前言:
为什么要写这本书
多年来,我一直在和各种不同的数据库打交道,见证了MySQL从一个小型的关系型数据库发展成为各大互联网企业的核心数据库系统的过程,期间参与了一些大大小小的项目开发工作,并成功地帮助开发人员构建了一些可靠的、健壮的应用程序。在这个过程中我积累了一些经验,正是这些不断累积的经验赋予了我灵感,于是有了本书。这本书实际上反映了这些年来我做了哪些事情,汇集了很多同行每天可能会遇到的一些问题,并给出了解决方案。
本书是“MySQL技术内幕”系列的第二本书,我将其命名为“SQL编程”而非“SQL查询”,因为我想让更多的开发人员和DBA意识到SQL也是一门语言,与我们平时接触的C语言等编程语言并没有什么不同。正因如此,我们也要追求SQL的编程之美。
然而与其他语言不同的是,SQL语言不仅是面向过程的语言,更多的时候,通过SQL语言提供的面向集合的思想可以解决数据库中遇到的很多问题。当然,SQL语言本身也提供了面向过程的方法,但是如果使用不当,会在数据库性能方面遭遇梦魇。SQL编程需要掌握的知识远比想象中多,只有掌握各种知识,综合运用面向过程和面向集合的思想,才能真正解决所遇到的问题。不要迷信网上的任何“神话”,不要被自己或他人的经验所左右。我一直坚信,只有理解了数据库内部运行的原理,才能承自然之道,“乘天地之正,而御六气之辩”,做到真正的“无招胜有招”。
另一方面,MySQL数据库目前大多被用于互联网的联机事务处理应用中,给大部分用户造成MySQL数据库不能执行复杂SQL查询的错觉。本书将列举各种复杂的查询,使用户了解MySQL数据库处理复杂查询的执行过程。此外,由于MySQL数据库的不断发展,其分支版本已经开始支持Hash Join。相信随着时间的推移以及MySQL数据库本身的不断发展,MySQL数据库同样会在联机分析处理应用中占有一席之地。大家需要做好这方面的准备,这也是本书将提供给你的。
最后,希望这本书可以引领开发人员及DBA从不同的角度来看待SQL语言和数据库的开发工作。倘若这本书能解决你在实际生产环境中遇到的问题,我会非常荣幸。
读者对象
数据库管理员
数据库开发人员
数据库架构设计师
各类应用程序开发人员
如何阅读本书
书中的示例一共用到三个数据库文件:一个是employees数据库,该数据库是MySQL数据库官方提供的示例数据库,主要用来模拟公司员工的数据,用户可以通过官网下载(http://dev.mysql.com/doc/index-other.html);另一个是dbt3数据库,是通过Database Test Suite程序生成的,该数据库较大,主要用来展示一些复杂的查询;还有一个tpcc数据库,是一个模拟TPC-C测试的数据库,用户可以从http://code.google.com/p/david-mysql-tools/下载。
本书一共有10章,每章都像一本迷你书,可以单独成册。用户可以有选择地阅读,但是推荐根据本书的组织方式进行阅读,这样会更具有条理性。
第1章 SQL编程
主要介绍了MySQL数据库的发展历史和什么是SQL编程。希望读者能通过该章了解MySQL的深厚历史背景,并且知道它已经不再是一个小型关系型数据库系统。此外,还重点强调了SQL编程的三个阶段,希望读者可以通过本书的学习达到最后的融合阶段。
第2章 数据类型
详细介绍了MySQL数据库中的各种数据类型和与之相应的各种SQL编程问题。数据类型是SQL编程的基石。每一位MySQL数据库应用的开发人员都应该好好阅读本章。
第3章 查询处理
深入探讨了逻辑查询与物理查询。逻辑查询帮助读者理解数据库应该得到怎样的结果;物理查询是MySQL数据库通过分析表的结构,选择最小成本的执行计划来处理SQL语句,但是无论怎样,最终的结果应该和逻辑查询一样。
第4章 子查询
子查询是被很多开发人员和DBA诟病的一个方面。如何正确地理解MySQL子查询的执行方式并实现对其优化,是本章最重要的任务。本章的最后还讲解了MySQL分支版本MariaDB对子查询的优化。在MariaDB数据库中,子查询再也不是什么难题了。
第5章 联接与集合操作
联接和集合是关系数据库中常见的操作,该章详细而深入地介绍了MySQL数据库中的各种联接及其内部的实现算法,同时也介绍了MariaDB数据库中引入的Hash Join,弥补了MySQL数据库在OLAP应用中的短板。本章最后针对集合的各种操作给出了解决方案。
第6章 聚合和旋转操作
聚合与旋转在报表系统中非常常见,本章主要讲解了MySQL数据库对上述两种操作的处理方法,以及一些常见问题的解决方案。
第7章 游标
游标是面向过程的编程方式,这与前几章介绍的面向集合的编程方式不同。虽然在大多数情况下游标处理的性能较低,但是只要在正确的场合使用,游标也会使SQL编程的效率得到极大提升。
第8章 事务编程
全面讲解了MySQL数据库中关于事务的各种编程技巧,同时也对事物的分类进行了详细的介绍。本章主要面向以InnoDB存储引擎为核心的应用编程。
第9章 索引
一般来说,索引可以提高SQL语句的执行速度,但是并非所有情况都是如此。本章详细分析了各种索引的内部实现,以及哪种情况下使用索引可以带来效率的提升。这对SQL编程来说非常重要。
第10章 分区
分区是设计表时需要考虑的重要问题之一。正确和有效地分区会对SQL编程带来巨大的影响。本章告诉读者应该如何分区,以及如何通过分区来进行SQL编程。
版权页:
第1章 SQL编程
1.1 MySQL数据库
1.2 SQL编程
1.3 数据库的应用类型
1.4 图形化的SQL查询分析器
1.5 小结
SQL是一种编程语言,用来解决关系数据库中的相关问题。SQL编程就是通过SQL语句来解决特定问题的一种编程方式。本章将介绍MySQL数据库中与SQL编程相关的基础知识,帮助SQL用户更好地理解MySQL数据库、数据库应用类型,以及与SQL编程相关的特定问题。
1.1 MySQL数据库
1.1.1 MySQL数据库历史 毫无疑问,目前MySQL已经成为最为流行的开源关系数据库系统,并且一步一步地占领了原有商业数据库的市场。可以看到Google、Facebook、Yahoo、网易、久游等大公司都在使用MySQL数据库,甚至将其作为核心应用的数据库系统。而MySQL数据库也不再仅仅应用于Web项目,其扮演的角色更为丰富。在网络游戏领域中,大部分的后台数据库都采用MySQL数据库,如大家比较熟悉的劲舞团、魔兽世界、Second Life等。很少能看到有哪个网络游戏数据库不是采用MySQL数据库的。此外,MySQL数据库已成功应用于中国外汇交易中心、中国移动、国家电网等许多项目中。越来越多的企业级项目应用“见证”了MySQL数据库的飞速发展,并预示着MySQL数据库本身正在逐渐完善并走向成熟。以前会有人诟病MySQL为什么没有视图,没有存储过程,没有触发器,没有事件调度器。而现在,MySQL还没有什么呢?经历了MySQL 5.0和5.1的发展,如今MySQL数据库迎来了重要的5.5版本。在了解MySQL 5.5带给我们的新特性之前,我们先来看看MySQL的发展历程。简单来说,MySQL数据库的发展可以概括为三个阶段:
初期开源数据库阶段。
Sun MySQL阶段。
Oracle MySQL阶段。
很多人以为MySQL是最近15年内才出现的数据库,其实MySQL数据库的历史可以追溯到1979年,那时Bill Gates退学没多久,微软公司也才刚刚起步,而Larry的Oracle公司也才成立不久。那时有一个天才程序员Monty Widenius为一个名为TcX的小公司打工,并且用BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。没过多久,Monty又将此工具用C语言进行了重写并移植到了UNIX平台。当时,这只是一个很底层的且仅面向报表的存储引擎,名叫Unireg。
虽然TcX这个小公司资源有限,但Monty天赋极高,面对资源有限的不利条件,反而更能发挥他的潜能。Monty总是力图写出最高效的代码,并因此养成了习惯。与Monty在一起的还有一些别的同事,很少有人能坚持把那些代码持续写到20年后,而Monty却做到了。
喜欢MySQL技术内幕:SQL编程 [平装]请与您的朋友分享,由于版权原因,读书人网不提供图书下载服务