1. 还原论
1.1. 认为可以把高级现象还原为低级基本现象的学说
1.2. 将复杂的东西看成是由简单单元组合而成的
1.2.1. 以赋值、条件分支、循环等作为基本处理单元,并将系统整体分割成很多这样的单元的思维方式
1.2.2. 文件系统也是将大量的数据分割成记录这样的小单元进行处理的
2. 整体论
2.1. 用系统、整体的观点考察有机界的理论
2.2. 也称“机体论”
2.3. SQL中没有赋值或者循环的处理,数据也不以记录为单位进行处理,而以集合为单位进行处理
2.3.1. SQL更像一种函数式语言
3. 递归集合
3.1. 冯·诺依曼提出用递归集合定义自然数,是在1923年发表的论文《关于超限序数的引入》中
3.1.1. SQL可以通过COUNT函数计算出元素个数,与冯·诺依曼方法的定义方式兼容性很好
3.2. 伟大的哲学家弗雷格(Friedrich Ludwig Gottlob Frege),他几乎以一己之力创建了关系模型基础之一的谓词逻辑
3.3. 因完善了现代集合论体系并提出良序定理和选择公理而闻名的数学家策梅洛(Ernst Friedrich Ferdinand Zermelo)
3.4. 弗雷格方法和冯·诺依曼方法很像,区别在于不用空集表示0,而用包含空集的集合来表示
3.5. 自然数的定义是由皮亚诺列举的5个条件给出的,冯·诺依曼等人只是根据皮亚诺公理生成了自然数而已
3.6. 使用λ演算函数来构建自然数的方法
3.6.1. 使用λ演算构建的自然数被阿隆佐·邱奇(Alonzo Church)以自己的姓氏命名为了“邱奇数”
3.6.2. 其本质却是输入输出均为函数的高阶函数
4. 用CASE表达式代替IF语句和CASE语句
4.1. CASE表达式与1+(2-4)或者(x*y)/z一样,都是表达式,在执行时会被整体当作一个值来处理
4.2. 常量可以理解为变量个数为0的表达式
4.3. CASE表达式最终会作为一个确定的值来处理
4.4. 可以把CASE表达式当作聚合函数的参数来使用
5. 用GROUP BY和关联子查询代替循环
5.1. SQL中没有专门的循环语句
5.1.1. 使用游标实现循环,但是这样的话还是面向过程的做法
5.1.2. 去掉普通编程语言中的循环正是SQL语言设计之初的目的之一
5.2. 将关系整体作为操作的对象。目的是避免循环
5.3. 面向过程语言在循环时经常用到的处理是“控制、中断”
5.3.1. 在SQL中,这两个处理可以分别用GROUP BY子句和关联子查询来表达
5.3.2. 关联子查询适合用来分割处理单元
6. 表中的行没有顺序
6.1. 对于文件来说,行的顺序是非常重要的
6.2. 表有意地放弃了行的顺序这一形象的概念,从而使它具有了更高的抽象度
6.3. 依赖顺序的不好的写法
6.3.1. 在定义视图时指定ORDER BY子句(如果某种数据库支持这种写法,那么它本身就有问题)
6.3.2. Oracle中的rownum这样依赖具体实现的“行编号”列
7. 将表看成集合
7.1. 理解表的抽象性的最好的方法是使用自连接
8. 理解EXISTS谓词和“量化”的概念
8.1. 谓词逻辑有100多年的历史,是现代逻辑学的标准逻辑体系
8.2. 对于SQL来说,量化符就是EXISTS谓词
8.3. 更应该灵活掌握的其实是其否定形式——NOT EXISTS的用法
8.3.1. 对于SQL中不具备的全称量化符,我们只能通过在程序中使用NOT EXISTS来表达
8.3.2. 通过德·摩根定律和NOT EXISTS来表达全称量化的方法
8.3.3. 使用NOT EXISTS的查询语句,可读性都不太好
8.3.3.1. 同样的功能也可以用HAVING子句或者ALL谓词来实现
8.3.4. NOT EXISTS有一个很大的优点,即性能比HAVING子句和ALL谓词要好得多
9. 学习HAVING子句的真正价值
9.1. 与WHERE子句不同,HAVING子句正是设置针对集合的条件的地方
10. 不要画长方形,去画圆
10.1. 能够准确描述静态数据模型的标准工具是维恩图,即“圆”