前言
# 前言
编程语言不断地推陈出新,如今仍在使用的编程语言中,很少有其起源能追溯到十多年前的。比如COBOL语言,它在大型机环境中仍被广泛使用;还有C语言,在操作系统、服务器开发以及嵌入式系统领域依然颇受欢迎。在数据库领域,SQL语言的起源可以一直追溯到20世纪70年代。
SQL是用于在关系型数据库中生成、操作和检索数据的语言。关系型数据库广受欢迎的原因之一在于,设计合理的关系型数据库能够处理海量数据。在处理大型数据集时,SQL就好比那些配备高倍变焦镜头的炫酷数码相机,你既可以用SQL查看大规模的数据集,也能聚焦到单个行数据(或者介于两者之间的任何粒度)。而其他数据库管理系统在负载过重时往往会崩溃,因为它们的关注点过于狭窄(就像变焦镜头被固定在最大倍率上),这就是为什么想要取代关系型数据库和SQL的尝试大多以失败告终。因此,尽管SQL是一门古老的语言,但它还会存在很长时间,并且前景光明。
本文为Alan_Beaulieu《Learning SQL-EN》的译本,首发于 cppguide.cn (opens new window)。
限于水平有限,如果您在阅读过程中有任何问题,可以联系小方(微信cppxiaofang),也欢迎加入小方的 技术交流群,群里面有很多技术高手,不定期发布招聘信息,加群请备注“加微信群”。
小方微信公众号【CppGuide】:
# 为什么要学习SQL?
如果你要使用关系型数据库,无论是编写应用程序、执行管理任务还是生成报告,都需要知道如何与数据库中的数据进行交互。即便你使用的是诸如报表工具这类能自动生成SQL的工具,有时也可能需要绕过自动生成功能,自己编写SQL语句。
学习SQL还有一个额外的好处,那就是能促使你去面对并理解用于存储组织信息的数据结构。当你对数据库中的表越来越熟悉时,可能会发现自己想要对数据库模式(database schema)提出修改或添加的建议。
# 为什么选择这本书来学习SQL?
SQL语言分为几个类别。用于创建数据库对象(表、索引、约束等)的语句统称为SQL模式语句(SQL schema statements)。用于创建、操作和检索数据库中存储的数据的语句被称为SQL数据语句(SQL data statements)。如果你是一名管理员,那么你会同时用到SQL模式语句和SQL数据语句。如果你是一名程序员或报表编写人员,可能只需要使用(或只被允许使用)SQL数据语句。虽然本书展示了许多SQL模式语句,但主要聚焦于编程特性。
SQL数据语句仅包含少数几个命令,看起来简单得让人掉以轻心。在我看来,许多现有的SQL书籍只是对这门语言所能实现的功能浅尝辄止,从而助长了这种错误认知。然而,如果你要使用SQL,就应该全面了解这门语言的功能,以及如何将不同的特性组合起来以产生强大的效果。我认为这本书是唯一一本详细介绍SQL语言,同时又不会厚得像“门挡”(你懂的,那些长达1250页的“完整参考手册”,往往在人们的办公隔间书架上积满灰尘)的书。
虽然本书中的示例可以在MySQL、Oracle数据库和SQL Server上运行,但我必须从这些产品中选择一个来承载示例数据库,并对示例查询返回的结果集进行格式化。在这三者之中,我选择了MySQL,因为它可以免费获取,安装方便,管理也简单。对于使用其他服务器的读者,我建议你下载并安装MySQL,加载示例数据库,这样就能运行示例并对数据进行试验。
# 内容结构
本书分为15章和3个附录:
- 第1章“一点背景知识”,探讨计算机化数据库的历史,包括关系模型和SQL语言的兴起。
- 第2章“创建并填充数据库”,展示如何创建一个MySQL数据库,创建本书示例中使用的表,并向表中填充数据。
- 第3章“查询入门”,介绍
select
语句,并进一步展示最常用的子句(select
、from
、where
)。 - 第4章“筛选”,展示可以在
select
、update
或delete
语句的where
子句中使用的不同类型的条件。 - 第5章“查询多个表”,展示查询如何通过表连接(table joins)来使用多个表。
- 第6章“集合操作”,介绍数据集以及它们在查询中如何相互作用。
- 第7章“数据生成、转换和操作”,展示几个用于操作或转换数据的内置函数。
- 第8章“分组和聚合”,展示如何对数据进行聚合。
- 第9章“子查询”,介绍子查询(这是我个人最喜欢的部分),并展示在何处以及如何使用它们。
- 第10章“再谈连接”,进一步探讨各种类型的表连接。
- 第11章“条件逻辑”,探讨如何在
select
、insert
、update
和delete
语句中使用条件逻辑(即if-then-else
)。 - 第12章“事务”,介绍事务并展示如何使用它们。
- 第13章“索引和约束”,探讨索引和约束。
- 第14章“视图”,展示如何构建一个接口,让用户避开数据的复杂性。
- 第15章“元数据”,展示数据字典的实用之处。
- 附录A“示例数据库的ER图”,展示本书所有示例使用的数据库模式。
- 附录B“MySQL对SQL语言的扩展”,展示MySQL的SQL实现中一些有趣的非ANSI特性。
- 附录C“练习答案”,展示各章练习的答案。
# 详细目录
- 前言
- 第1章 一点背景知识
- 数据库简介
- 非关系型数据库系统
- 关系模型
- 一些术语
- 什么是SQL?
- SQL语句分类
- SQL:一种非过程化语言
- SQL示例
- 什么是MySQL?
- 内容概览
- 第2章 创建并填充数据库
- 创建MySQL数据库
- 使用mysql命令行工具
- MySQL数据类型
- 字符数据
- 数字数据
- 时间数据
- 表的创建
- 步骤1:设计
- 步骤2:细化
- 步骤3:构建SQL模式语句
- 填充和修改表
- 插入数据
- 更新数据
- 删除数据
- 当正确的语句出错时
- 主键不唯一
- 外键不存在
- 列值违规
- 无效的日期转换
- 银行模式
- 第3章 查询入门
- 查询机制
- 查询子句
- select子句
- 列别名
- 去除重复项
- from子句
- 表
- 表链接
- 定义表别名
- where子句
- group by和having子句
- order by子句
- 升序与降序排序顺序
- 通过表达式排序
- 通过数字占位符排序
- 知识测验
- 第4章 筛选
- 条件求值
- 使用括号
- 使用not运算符
- 构建条件
- 条件类型
- 相等条件
- 范围条件
- 成员条件
- 匹配条件
- NULL:那个四个字母的单词
- 知识测验
- 第5章 查询多个表
- 什么是连接?
- 笛卡尔积
- 内连接
- ANSI连接语法
- 连接三个或更多表
- 使用子查询作为表
- 两次使用同一个表
- 自连接
- 等值连接与非等值连接
- 连接条件与筛选条件
- 知识测验
- 第6章 集合操作
- 集合论入门
- 集合论实践
- 集合运算符
- union运算符
- intersect运算符
- except运算符
- 集合操作规则
- 对复合查询结果进行排序
- 集合操作优先级
- 知识测验
- 第7章 数据生成、转换和操作
- 处理字符串数据
- 字符串生成
- 字符串操作
- 处理数字数据
- 执行算术函数
- 控制数字精度
- 处理有符号数据
- 处理时间数据
- 处理时区
- 生成时间数据
- 操作时间数据
- 转换函数
- 知识测验
- 处理字符串数据
- 第8章 分组和聚合
- 分组概念
- 聚合函数
- 隐式分组与显式分组
- 统计不同值的数量
- 使用表达式
- 处理NULL值
- 生成组
- 单列分组
- 多列分组
- 通过表达式分组
- 生成汇总
- 组筛选条件
- 知识测验
- 第9章 子查询
- 什么是子查询?
- 子查询类型
- 非相关子查询
- 多行单列子查询
- 多列子查询
- 相关子查询
- exists运算符
- 使用相关子查询进行数据操作
- 何时使用子查询
- 子查询作为数据源
- 筛选条件中的子查询
- 子查询作为表达式生成器
- 子查询总结
- 知识测验
- 第10章 再谈连接
- 外连接
- 左外连接与右外连接
- 三向外连接
- 自外连接
- 交叉连接
- 自然连接
- 知识测验
- 第11章 条件逻辑
- 什么是条件逻辑?
- Case表达式
- 搜索Case表达式
- 简单Case表达式
- Case表达式示例
- 结果集转换
- 选择性聚合
- 检查存在性
- 除零错误
- 条件更新
- 处理NULL值
- 知识测验
- 第12章 事务
- 多用户数据库
- 锁定
- 锁定粒度
- 什么是事务?
- 开始事务
- 结束事务
- 事务保存点
- 知识测验
- 第13章 索引和约束
- 索引
- 索引创建
- 索引类型
- 索引的使用方式
- 索引的缺点
- 约束
- 约束创建
- 约束和索引
- 级联约束
- 知识测验
- 索引
- 第14章 视图
- 什么是视图?
- 为什么使用视图?
- 数据安全性
- 数据聚合
- 隐藏复杂性
- 连接分区数据
- 可更新视图
- 更新简单视图
- 更新复杂视图
- 知识测验
- 第15章 元数据
- 关于数据的数据
- Information_Schema
- 使用元数据
- 模式生成脚本
- 部署验证
- 动态SQL生成
- 知识测验
- 附录A 示例数据库的ER图
- 附录B MySQL对SQL语言的扩展
- 附录C 练习答案