简介

概要

SQL 的语法非常容易学习。一些最基本的构思和一些简单的关键字就能让你通过查询去解决大量的问题。然而,很多使用者却发现他们面对一些特殊的问题是经常被困住。当某些人说“这就是我的做法“时,却并非你所想要的结果。你可能会需要通过各种办法来尝试解决这些麻烦的问题。一旦你准备开始一次查询,你就必须做好检查、修改还有改进你的方案,直到你获得了你所要的东西。

双管齐下

在本书中,我始终会用两种不同的方式来进行查询。这两种方式分别源于关系代数(relational algebra)和关系演算(relational calculus)注0。在本书中我会保证不采用数学模式去描述,但也可以去阅读附录2中正式的数学表达来了解底层的逻辑。我把第一种方法叫做过程方法(proces approach),对可以作用在表(table)上不同类型的操作进行解释。比如 joinintersectselect注1。一旦你知道了你想要怎么样的操作,马上就可以将其转变成相应的 SQL 。

第二种方法是在我没办法搞明白我该用哪种方式才能获得我想要的结果时用的。我把这种方法叫做结果方法(outcome approach),让你描述你想要的一个结果可能会是怎么样的,比如有哪些条件是必须的。再去看数据,这非常容易的可以得到一个半正式的完整结果,以及在语义的作用下,辨认出”不正确“的结果。将这种半正式的描述转变为查询将非常的直观。

我对我的学生面对新问题是所采用的方法感到非常惊讶。有些人会随时查看所需要的操作,而其他人会从结果中找出更直观的方法。选择不仅仅在一种查询方式和另一种查询方式之间发生,也同时在人和人之间我甚至每天都如此。有多种方式让你选择意味着你可以更少的被新问题所困扰。

这本书的读者是谁?

本书适合可以设计出设计良好的(well-designed)关系型数据库(relational database)以及想要从中学到什么的人。你或许已经从之前的那句话中察觉到数据库必须被“良好的设计”。我不能太过于强调这点。如果你的数据库设计的非常糟糕,那它可能无法储存准确、一致的数据,以及在你通过查询获取数据的时候会经常发生偏差。如果你想知道如何从头开始设计一个数据库,或许你应该去读我的第一本书《开始数据库设计注2》。这本书的最后一章将会略微讲述一些数据库设计中常见的问题,并给出一些建议来减少对设计的影响或者改正问题。

这本书的目的

在这本书中,我将介绍所有和 SQL 查询有关的主要技术和关键字(keyword)。你会学到对行(row)进行的 joinintersect , union , difference , select 操作以及字段(column)进行投影(projection)。你将看到怎么通过或者简单,或者嵌套的实现方式去完成查询,会介绍各种用于聚合(aggregating)和汇总(summarizing)数据的技术,以及包括使用窗口函数(window functions)。你还会学到怎么去调查和提高查询的效率。

最重要的是,你将会学到通过不同的方式去解决问题。总是会用几种方式来可以进行查询,而我的目标就是针对任何特定情况,我总会提供一种符合你的内心预期的方法(玩笑)。

第二版的新内容

我新增了一个关于窗口函数的章节。在这个章节中将会介绍关于窗口函数最新的功能用于聚合和汇总数据。

附录提供了简单易懂的介绍去了解正式的关系概念和相关符号。

译注

注0. 关系代数:关系代数是一阶逻辑的分支,是闭合于运算下的关系的集合。运算作用于一个或多个关系上来生成一个关系。关系代数是计算机科学的一部分。
参考资料:https://zh.wikipedia.org/wiki/关系代数_(数据库)

关系演算:关系演算包括元组关系演算和域关系演算,是数据库的关系模型的一部分,提供了查询数据库的声明性方式。关系演算与关系模型中的关系代数相反,因为关系代数提供的是查询数据库的过程性方式。参考资料:https://zh.wikipedia.org/wiki/关系演算
注1. 这一段不太容易直译,就原文来看,就是三个结合(join)、交叉(intersection)和选择(selection),但感觉这里还是直接翻译成 SQL 术语会来的更适合一些。如果理解有误,还望老司机们指点
注2. 原书注:Clare Churcher, Beginning Database Design: From Novice to Professional (New York: Apress, 2012).

results matching ""

    No results matching ""