前言

# 前言

编程语言不断地推陈出新,如今仍在使用的编程语言中,很少有其起源能追溯到十多年前的。比如COBOL语言,它在大型机环境中仍被广泛使用;还有C语言,在操作系统、服务器开发以及嵌入式系统领域依然颇受欢迎。在数据库领域,SQL语言的起源可以一直追溯到20世纪70年代。

SQL是用于在关系型数据库中生成、操作和检索数据的语言。关系型数据库广受欢迎的原因之一在于,设计合理的关系型数据库能够处理海量数据。在处理大型数据集时,SQL就好比那些配备高倍变焦镜头的炫酷数码相机,你既可以用SQL查看大规模的数据集,也能聚焦到单个行数据(或者介于两者之间的任何粒度)。而其他数据库管理系统在负载过重时往往会崩溃,因为它们的关注点过于狭窄(就像变焦镜头被固定在最大倍率上),这就是为什么想要取代关系型数据库和SQL的尝试大多以失败告终。因此,尽管SQL是一门古老的语言,但它还会存在很长时间,并且前景光明。

本文为Alan_Beaulieu《Learning SQL-EN》的译本,首发于 cppguide.cn (opens new window)

限于水平有限,如果您在阅读过程中有任何问题,可以联系小方(微信cppxiaofang),也欢迎加入小方的 技术交流群,群里面有很多技术高手,不定期发布招聘信息,加群请备注“加微信群”。

小方微信公众号【CppGuide】:

img

# 为什么要学习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语句,并进一步展示最常用的子句(selectfromwhere)。
  • 第4章“筛选”,展示可以在selectupdatedelete语句的where子句中使用的不同类型的条件。
  • 第5章“查询多个表”,展示查询如何通过表连接(table joins)来使用多个表。
  • 第6章“集合操作”,介绍数据集以及它们在查询中如何相互作用。
  • 第7章“数据生成、转换和操作”,展示几个用于操作或转换数据的内置函数。
  • 第8章“分组和聚合”,展示如何对数据进行聚合。
  • 第9章“子查询”,介绍子查询(这是我个人最喜欢的部分),并展示在何处以及如何使用它们。
  • 第10章“再谈连接”,进一步探讨各种类型的表连接。
  • 第11章“条件逻辑”,探讨如何在selectinsertupdatedelete语句中使用条件逻辑(即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 练习答案
上次更新: 2026/07/14, 19:37:40

社区交流

讨论与留言

前往 GitHub Issues →

本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。

最近更新
第 1 课:专栏导论与安全边界
07-01
第 3 课:安装编译与调试环境
07-01
第 4 课:第三方库下载、编译与依赖管理
07-01
更多文章>