SQL Server 2008技术内幕(T-SQL查询)学习之第二章:集合论和谓词逻辑

集合论和谓词逻辑

数学发展史上的两个重要基石:集合论和谓词逻辑,它们和数据库领域有着非常密切的关系。 数据库中的表代表事实的集合。数据库查询就是在查询谓词的基础上生成结果集

 

逻辑学的研究对象是命题和命题函数。命题是表达事实或为真、或为假的语句。命题函数是带有一个或多个没有指定取值的变元的开放语句。数据库表保存代表事实的语句,而查询谓词则是命题函数

 

如何用基于集合的思维来编写一条T-SQL SELECT查询,返回以下结果集:“来自USA的雇员已经至少为其处理过1个订单的客户”

 

自然语言表述到数学表示的转换

首先用集合论的数学语言表示讨论一下:“由每个来自USA的雇员已经至少为其处理过1个订单的所有客户”这个问题,按照自然语言转换成数学语言的方式,要比单纯地做数学题或说话难得多,但这样会重点突出一些对SQL程序员来说特别有用的数学思想。 

 

1. 首先为要求的结果集起一个名字

集合S的定义(自然语言描述):S是来自USA的雇员至少为其处理过1个订单的所有客户组成的集合

我们对S集合做出了一个假设:对该集合的描述具有清晰的含义,即,没有歧义的对集合元素进行了描述

上述集合定义中提及了客户,雇员和订单,以数学的方式谈论了这三类事物的关系,我们应该将他们看作是集合,并为他们命名:让CustomersEmployees、和Orders分别代表客户,雇员和订单的集合。

描述中提到一个有意义的词,但它不代表某种事物:“处理过”。再一次,对于雇员为客户处理订单,我们不需要从业务的观点来搞清楚这个词到底意味着什么,我们只需要理解:“给定适当的细节,”已经处理过”或者为真、或者为假。”我们还必须搞清楚,关于什么细节,它为真或为假。如果我们仔细分析描述是如何使用“处理过”这个词,会发现它和三个细节有关:雇员,订单和客户。

如果能够把特定情况已经处理过的(handled)订单事实记下来,这将非常有用。对于特定的一个雇员e、订单o和客户c,事实(雇员e处理过客户c的订单o),或者为真,或者为佳。 换句话说,这就是一个谓词,如果使用函数来表示可以用handled(e,o,c)来表示事实“雇员e处理过客户c的订单o的真值” 根据e,oc的不同取值。 Handled(e,o,c)就会有相应的真值

在描述中需要表示的最后一个元素是“来自USA”。是否来自USA这是雇员的一个属性。可以用fromUSA(e)来代表“雇员e来自USA”的真值。 为了简单起见,我们用USAEmployees为来自USA的雇员集合,或者用数学语言来表示,让USAEmployees={e ∈ Employess:fromUSA(e)};

问题:就集合CustomersUSAEmployeesOrders,以及函数handled(e,o,c)来说,特定的客户c在什么情况下才会属于S

答案:客户c术语S,当且仅当对于集合USAEmpoyees的每个(雇员)e,在集合Order中至少存在一个(订单)o,满足handled(e,o,c)

集合S的定义(数学方式描述):

 

 

总结

 利用数学解题的思想,先将结果定义好。然后反推大体需要的数据集合(这里的e,o,c)。然后再根据需要对集合进行进一步过滤(fromUSA(e)

以上是根据书中内容进行的总结,如有其他大神有读到见解,还麻烦分享,跪谢之:)

 

未完待续.....

你可能感兴趣的:(SQL Server 2008技术内幕(T-SQL查询)学习之第二章:集合论和谓词逻辑)