本书帮助读者掌握MySQL 5提供的SQL,并且充分利用其强大的功能。本书通过大量示例以及动手练习阐释了每一个关键概念、技术和语言及其高级功能,使得创建最复杂的语句和程序也变得很容易。
作者深刻揭示了MySQL的工作原理以及如何充分利用其功能,读者将能深入理解和掌握从基本查询到存储过程、事务和数据安全性等所有内容。本书可以帮助读者从“学徒”转变成为一个真正的SQL专家。
本书的所有示例程序都可以从www.r20.nl下载。
主要内容
●编写查询,包括连接、函数和子查询;
●更新数据;
●创建表、视图和其他数据库对象;
●声明主键、外键以及其他完整性约束;
●使用索引提高效率;
●通过密码和权限来增强安全性;
●在PHP程序中嵌入SQL;
●使用事务、锁、回滚和隔离级;
●使用MySQL的目录。
MySQL是最流行的开放源码SQL数据库管理系统。由于富有竞争力的价格和易于使用,MySQL市场占有率逐步提升。权威调查显示,在2007年上半年,MySQL的使用率从38.5%升至43.4%。尤其是在LAMP(Linux+Apache+MySQL+PHP)架构的提出之后,MySQL的应用更是找到了一个较为理想的发挥平台。
在今天的IT行业,用户对于掌握MySQL数据库服务器技术,有着迫切的实际需求。正因为如此,我们看到市面上关于MySQL的图书越来越多,而本书则是这些图书中具有特色的畅销书。说它独特,因为它并不是一本MySQL全书,而是关注MySQL的一个方面,即驱动MySQL的语言,也就是SQL(Structured Query Language,标准查询语言)。说它畅销,是因为作者Rick F. van der Lans是极富经验的数据库技术讲师和畅销书作者,而本书自荷兰语版出版以后,先后被翻译为各种语言版本,销量超过十万册。
全书分为5个部分和一个附录。第一部分由几个介绍性的主题组成。包括MySQL的历史、本书示例数据库、SQL语言的一般性等。第二部分完全关注于表的查询和更新,主要介绍SELECT语句,还介绍了如何使用XML文档。第三部分介绍数据库对象(包括表、主键、替代键、外键、索引和视图)的创建,这部分还介绍了数据安全性。第四部分描述存储过程、存储函数、触发器和事件。第五部分介绍SQL编程。本书最后是一些附录,包括SQL语法、标量函数和系统变量等有用信息。
除了专注于MySQL的驱动语言SQL之外,本书还有两个比较显著的特色。
首先,本书是一本教程而不是一本参考书。因此,它包含了很多示例和练习(以及练习解答)。全书以问题提出、给出示例语句和结果、示例分析的方式,对每一个示例进行了细致的讲解和说明。读者可以非常容易地掌握本书所介绍的内容。在各节中还穿插了很多具有针对性的练习,帮助读者巩固该章所学习到的知识。在每章的末尾,给出了练习的解答,方便读者核对。
其次,本书的网站www.r20.nl提供了丰富的附加内容和服务。不仅指导读者安装示例数据库,而且提供了示例的代码下载。考虑到一些示例可能会改变数据库中的表内容,作者还在网站上提供了恢复数据库初始内容的服务。
本书由许杰星、李强翻译,参加翻译工作的还有罗娜、刘金华、刘伟超、罗庚臣、 刘二然、郑芳菲、庄逸川、王世高、郭莹、陈、邓勇、何进伟、贾晓斌、汪蔚、齐国涛。
译者深深感觉到,本书能够受到世界各地众多读者的喜爱,肯定是有原因的。原因在于作者对本书编写下了很多功夫,而且提供了细致周到的网络服务。正所谓,付出才有回报。有幸翻译这样一本MySQL的优秀教程,译者也正是抱着和作者同样的态度来翻译本书的。然而,译者水平有限,其中难免有个别疏漏之处,欢迎读者朋友们耐心指正,以求共同进步。
让我们付出自己的努力来学习MySQL吧!本书一定会给你带来收获和回报。
封面图
目录
- 译者序
- 前言
- 第一部分 综述
- 第1章 MySQL简介2
- 1.1 简介2
- 1.2 数据库、数据库服务器和数据库语言2
- 1.3 关系模型3
- 1.3.1 表、列和行4
- 1.3.2 Null值5
- 1.3.3 约束5
- 1.3.4 主键5
- 1.3.5 候选键6
- 1.3.6 替换键6
- 1.3.7 外键6
- 1.4 SQL是什么7
- 1.5 SQL的历史10
- 1.6 从单机到客户/服务器再到Internet10
- 1.7 SQL的标准12
- 1.8 什么是开源软件14
- 1.9 MySQL的历史15
- 1.10 本书的组织结构16
- 第2章 网球俱乐部示例数据库17
- 2.1 简介17
- 2.2 网球俱乐部简介17
- 2.3 表的内容19
- 2.4 完整性约束21
- 第3章 安装软件23
- 3.1 简介23
- 3.2 下载MySQL23
- 3.3 安装MySQL23
- 3.4 安装查询工具23
- 3.5 从Web站点下载SQL语句23
- 3.6 准备好了吗24
- 第4章 SQL概要25
- 4.1 简介25
- 4.2 登录到MySQL数据库服务器25
- 4.3 创建新的SQL用户26
- 4.4 创建数据库27
- 4.5 选择当前数据库27
- 4.6 创建表28
- 4.7 用数据填充表29
- 4.8 查询表30
- 4.9 更新和删除行32
- 4.10 使用索引优化查询过程33
- 4.11 视图34
- 4.12 用户和数据安全性35
- 4.13 删除数据库对象36
- 4.14 系统变量36
- 4.15 对SQL语句分组37
- 4.16 Catalog表37
- 4.17 获取错误和警告43
- 4.18 SQL语句的定义44
- 第二部分 查询和更新数据
- 第5章 SELECT语句:常用元素46
- 5.1 简介46
- 5.2 直接量及其数据类型46
- 5.2.1 整型直接量49
- 5.2.2 小数直接量49
- 5.2.3 浮点直接量49
- 5.2.4 字符直接量49
- 5.2.5 日期直接量51
- 5.2.6 时间直接量53
- 5.2.7 日期时间直接量和时间戳直接量54
- 5.2.8 年直接量56
- 5.2.9 布尔直接量56
- 5.2.10 十六进制直接量56
- 5.2.11 位直接量56
- 5.3 表达式57
- 5.4 为结果列分配名字59
- 5.5 列指定61
- 5.6 用户变量和SET语句62
- 5.7 系统变量63
- 5.8 CASE表达式65
- 5.9 括号中的标量表达式70
- 5.10 标量函数70
- 5.11 表达式的类型转换73
- 5.12 作为一个表达式的空值75
- 5.13 复合标量表达式76
- 5.13.1 复合数值表达式76
- 5.13.2 复合字符表达式81
- 5.13.3 复合日期表达式82
- 5.13.4 复合时间表达式86
- 5.13.5 复合时间戳和日期时间表达式87
- 5.13.6 复合布尔表达式89
- 5.14 聚合函数和标量子查询91
- 5.15 行表达式91
- 5.16 表表达式92
- 5.17 练习解答93
- 第6章 SELECT语句、表表达式和子查询97
- 6.1 简介97
- 6.2 SELECT语句的定义97
- 6.3 处理一个选择语句块中的子句100
- 6.4 表表达式的形式105
- 6.5 什么是SELECT语句107
- 6.6 什么是子查询108
- 6.7 练习解答112
- 第7章 SELECT语句:FROM子句117
- 7.1 简介117
- 7.2 FROM子句中的表指定117
- 7.3 再谈列指定118
- 7.4 FROM子句中的多个表指定119
- 7.5 表名的假名122
- 7.6 联接的各种例子122
- 7.7 必须使用假名的情况125
- 7.8 不同数据库的表127
- 7.9 FROM子句中的显式联接127
- 7.10 外联接130
- 7.10.1 左外联接130
- 7.10.2 右外联接133
- 7.11 自然联接134
- 7.12 联接条件中的附加条件135
- 7.13 交叉联接137
- 7.14 使用USING替换联接条件137
- 7.15 带有表表达式的FROM子句138
- 7.16 练习解答144
- 第8章 SELECT语句:WHERE子句149
- 8.1 简介149
- 8.2 使用比较运算符的条件150
- 8.3 子查询中的比较运算符155
- 8.4 带有关联性子查询的比较运算符159
- 8.5 不带比较运算符的条件161
- 8.6 用AND、OR、XOR和NOT
- 组合的条件162
- 8.7 使用表达式列表的IN运算符165
- 8.8 带有子查询的IN运算符169
- 8.9 BETWEEN运算符176
- 8.10 LIKE运算符178
- 8.11 REGEXP运算符180
- 8.12 MATCH运算符186
- 8.13 IS NULL运算符194
- 8.14 EXISTS运算符196
- 8.15 ALL和ANY运算符198
- 8.16 子查询中列的作用域204
- 8.17 使用关联性子查询的更多例子207
- 8.18 带有否定的条件211
- 8.19 练习解答213
- 第9章 SELECT语句:SELECT子句和
- 聚合函数224
- 9.1 简介224
- 9.2 选择所有列(*)224
- 9.3 SELECT子句中的表达式225
- 9.4 使用DISTINCT移除重复的行226
- 9.5 何时两行相等228
- 9.6 更多选择选项230
- 9.7 聚合函数简介231
- 9.8 COUNT函数232
- 9.9 MAX和MIN函数235
- 9.10 SUM和AVG函数239
- 9.11 VARIANCE和STDDEV函数242
- 9.12 VAR_SAMP和STDDEV_SAMP函数243
- 9.13 BIT_AND、BIT_OR和BIT_XOR函数244
- 9.14 练习解答244
- 第10章 SELECT语句:GROUP BY子句248
- 10.1 简介248
- 10.2 对一列分组248
- 10.3 对两个或更多列分组251
- 10.4 根据表达式分组253
- 10.5 对空值的分组254
- 10.6 带有排序的分组255
- 10.7 GROUP BY子句的一般规则255
- 10.8 GROUP_CONCAT函数257
- 10.9 使用GROUP BY的复杂例子258
- 10.10 使用ROLLUP的分组263
- 10.11 练习解答264
- 第11章 SELECT语句:HAVING子句268
- 11.1 简介268
- 11.2 HAVING子句的例子269
- 11.3 没有GROUP BY子句的
- HAVING子句270
- 11.4 HAVING子句的一般规则271
- 11.5 练习解答271
- 第12章 SELECT语句:ORDER BY子句274
- 12.1 简介274
- 12.2 按照列名排序274
- 12.3 根据表达式排序276
- 12.4 使用顺序号码排序277
- 12.5 按照升序和降序排序278
- 12.6 对空值排序280
- 12.7 练习解答281
- 第13章 SELECT语句:LIMIT子句282
- 13.1 简介282
- 13.2 获取最前面的值284
- 13.3 使用LIMIT子句的子查询286
- 13.4 带有偏移量的LIMIT289
- 13.5 SQL_CALC_FOUND_ROWS
- 选择选项289
- 13.6 练习解答290
- 第14章 组合表表达式292
- 14.1 简介292
- 14.2 使用UNION组合292
- 14.3 使用UNINON的规则295
- 14.4 保留重复的行297
- 14.5 集合运算符和空值298
- 14.6 练习解答298
- 第15章 用户变量和SET语句300
- 15.1 简介300
- 15.2 使用SET语句定义变量300
- 15.3 使用SELECT语句定义变量301
- 15.4 用户变量的应用区域303
- 15.5 用户变量的生命期303
- 15.6 DO语句304
- 15.7 练习解答304
- 第16章 HANDLER语句306
- 16.1 简介306
- 16.2 HANDLER语句的简单示例306
- 16.3 打开一个句柄307
- 16.4 浏览句柄的行307
- 16.5 关闭句柄310
- 16.6 练习解答310
- 第17章 更新表311
- 17.1 简介311
- 17.2 插入新的一行311
- 17.3 使用另一个表中的行来填充一个表314
- 17.4 更新行中的值316
- 17.5 更新多个表中的值319
- 17.6 替代已有的行321
- 17.7 从一个表中删除行322
- 17.8 从多个表中删除行323
- 17.9 TRUNCATE语句325
- 17.10 练习解答325
- 第18章 载入和卸载数据328
- 18.1 简介328
- 18.2 卸载数据328
- 18.3 载入数据331
- 第19章 使用XML文档335
- 19.1 XML概述335
- 19.2 存储XML文档336
- 19.3 查询XML文档339
- 19.4 使用位置查询344
- 19.5 XPath的扩展表示法346
- 19.6 带有条件XPath表达式348
- 19.7 修改XML文档348
- 第三部分 创建数据库对象
- 第20章 创建表352
- 20.1 简介352
- 20.2 创建新表352
- 20.3 列的数据类型354
- 20.3.1 整数数据类型356
- 20.3.2 小数数据类型357
- 20.3.3 浮点数据类型357
- 20.3.4 位数据类型360
- 20.3.5 字符数据类型360
- 20.3.6 时间日期类型361
- 20.3.7 Blob数据类型361
- 20.3.8 几何数据类型362
- 20.4 添加数据类型选项362
- 20.4.1 数据类型选项UNSIGNED362
- 20.4.2 数据类型选项ZEROFILL363
- 20.4.3 数据类型选项AUTO_
- INCREMENT365
- 20.4.4 数据类型选项SERIAL
- DEFAULT VALUE367
- 20.5 创建临时表367
- 20.6 如果表已经存在368
- 20.7 复制表368
- 20.8 命令表和列371
- 20.9 列选项:Default和Comment372
- 20.10 表选项374
- 20.10.1 ENGINE表选项374
- 20.10.2 AUTO_INCREMENT表选项378
- 20.10.3 COMMENT表选项378
- 20.10.4 AVG_ROW_LENGTH、MAX_ROWS
- 和MIN_ROWS表选项379
- 20.11 CSV存储引擎379
- 20.12 表和目录381
- 20.13 练习解答383
- 第21章 声明完整性约束385
- 21.1 简介385
- 21.2 主键386
- 21.3 替代键388
- 21.4 外键390
- 21.5 参照动作393
- 21.6 Check完整性约束395
- 21.7 命名完整性约束396
- 21.8 删除完整性约束397
- 21.9 完整性约束和目录397
- 21.10 练习解答397
- 第22章 字符集和校对400
- 22.1 简介400
- 22.2 可用的字符集和校对401
- 22.3 给列分配字符集402
- 22.4 给列分配校对404
- 22.5 带有字符集和校对的表达式405
- 22.6 使用校对排序和分组407
- 22.7 表达式的可压缩性408
- 22.8 相关的系统变量409
- 22.9 字符集和目录410
- 22.10 练习解答410
- 第23章 ENUM和SET类型411
- 23.1 简介411
- 23.2 ENUM数据类型411
- 23.3 SET数据类型414
- 23.4 练习解答419
- 第24章 修改和删除表420
- 24.1 简介420
- 24.2 删除整个表420
- 24.3 重命令表421
- 24.4 修改表结构421
- 24.5 修改列423
- 24.6 修改完整性约束425
- 24.7 练习解答427
- 第25章 使用索引428
- 25.1 简介428
- 25.2 行、表和文件428
- 25.3 索引是如何工作的429
- 25.4 处理一条SELECT语句的步骤432
- 25.5 创建索引435
- 25.6 在定义表时定义索引437
- 25.7 删除索引439
- 25.8 索引和主键439
- 25.9 大PLAYERS_XXL表440
- 25.10 为索引选择列442
- 25.10.1 候选键上的唯一索引442
- 25.10.2 外键上的索引442
- 25.10.3 包含在选择标准中的列上的索引442
- 25.10.4 在列的组合上的索引444
- 25.10.5 用来排序的列上的索引445
- 25.11 索引和目录445
- 25.12 练习解答447
- 第26章 视图448
- 26.1 简介448
- 26.2 创建视图448
- 26.3 视图的列名451
- 26.4 更新视图:使用CHECK OPTION452
- 26.5 视图的选项453
- 26.6 删除视图454
- 26.7 视图和目录454
- 26.8 对更新视图的限制455
- 26.9 处理视图语句456
- 26.10 视图的应用程序区域458
- 26.10.1 例程语句的简化458
- 26.10.2 重新组织表458
- 26.10.3 SELECT语句的分步编写461
- 26.10.4 声明完整性约束462
- 26.10.5 数据安全性462
- 26.11 练习解答462
- 第27章 创建数据库464
- 27.1 简介464
- 27.2 数据库和目录464
- 27.3 新建数据库465
- 27.4 修改数据库465
- 27.5 删除数据库466
- 第28章 用户和数据安全性468
- 28.1 简介468
- 28.2 添加和删除用户468
- 28.3 修改用户名470
- 28.4 修改密码471
- 28.5 授予表权限和列权限471
- 28.6 授予数据库权限473
- 28.7 授予用户权限475
- 28.8 权限的传递:WITH GRANT OPTION478
- 28.9 限制权限479
- 28.10 在目录中记录权限479
- 28.11 回收权限481
- 28.12 视图和通过视图的安全性483
- 28.13 练习解答484
- 第29章 表维护语句485
- 29.1 简介485
- 29.2 ANALYZE TABLE语句485
- 29.3 CHECKSUM TABLE语句486
- 29.4 OPTIMIZE TABLE语句487
- 29.5 CHECK TABLE语句488
- 29.6 REPAIR TABLE语句489
- 29.7 BACKUP TABLE语句490
- 29.8 RESTORE TABLE语句490
- 第30章 SHOW、DESCRIBE和HELP语句491
- 30.1 简介491
- 30.2 SHOW语句概览491
- 30.3 其他SHOW语句494
- 30.4 DESCRIBE语句495
- 30.5 HELP语句495
- 第四部分 过程式数据库对象
- 第31章 存储过程498
- 31.1 简介498
- 31.2 存储过程的简例498
- 31.3 存储过程的参数500
- 31.4 存储过程体500
- 31.5 局部变量502
- 31.6 SET语句504
- 31.7 流程控制语句504
- 31.8 调用存储过程510
- 31.9 使用SELECT INTO查询数据512
- 31.10 出错消息、处理程序和条件515
- 31.11 使用一个游标来获取数据519
- 31.12 包含不带游标的SELECT语句523
- 31.13 存储过程和用户变量524
- 31.14 存储过程的特征524
- 31.15 存储过程和目录526
- 31.16 删除存储过程527
- 31.17 存储过程的安全性528
- 31.18 存储过程的优点528
- 第32章 存储函数530
- 32.1 简介530
- 32.2 存储函数的例子531
- 32.3 存储函数的更多内容535
- 32.4 删除存储函数536
- 第33章 触发器537
- 33.1 简介537
- 33.2 触发器的例子537
- 33.3 更多复杂的例子540
- 33.4 作为完整性约束的触发器542
- 33.5 删除触发器544
- 33.6 触发器和目录544
- 33.7 练习解答544
- 第34章 事件546
- 34.1 什么是事件546
- 34.2 创建事件546
- 34.3 事件的属性553
- 34.4 修改事件554
- 34.5 删除事件555
- 34.6 事件和权限555
- 34.7 事件和目录556
- 第五部分 SQL编程
- 第35章 MySQL和PHP558
- 35.1 简介558
- 35.2 登录到MySQL558
- 35.3 选择数据559
- 35.4 创建索引560
- 35.5 获取出错消息562
- 35.6 会话中的多个连接562
- 35.7 带有参数的SQL语句564
- 35.8 带有一行的SELECT语句565
- 35.9 带有多行的SELECT语句566
- 35.10 带有空值的SELECT语句569
- 35.11 查询有关表达式的数据571
- 35.12 查询目录573
- 35.13 保留的MYSQL函数574
- 第36章 动态SQL576
- 36.1 简介576
- 36.2 使用预处理SQL语句576
- 36.3 使用用户变量的预处理语句577
- 36.4 使用参数的预处理语句578
- 36.5 存储过程中的预处理语句578
- 第37章 事务和多用户使用581
- 37.1 简介581
- 37.2 什么是事务581
- 37.3 开始事务585
- 37.4 保存点585
- 37.5 存储过程和事务587
- 37.6 多用户使用的问题587
- 37.6.1 脏读或未提交的读588
- 37.6.2 非重复读588
- 37.6.3 幻读589
- 37.6.4 遗失更新589
- 37.7 锁定590
- 37.8 死锁590
- 37.9 LOCK TABLE和UNLOCK
- TABLE语句591
- 37.10 隔离级592
- 37.11 等待一个锁593
- 37.12 处理语句的时刻593
- 37.13 使用应用程序锁594
- 37.14 练习解答595
- 附录