(基本)SQL查询在语义上是否等同于高阶函数?


11

SQL基本上是map + fold + filter的特定于域的实例吗?

在我看来,以下SQL:

SELECT name
FROM fruits
WHERE calories < 100 

只是以下map + filter + fold操作的语法糖:

var fruits = [{id : 1, name: 'orange', calories : 100},
    {id : 2, name : 'banana',  calories : 150},
    {id : 3, name: 'apple', calories : '50'}];

fruits.map(function(fruit) { return { name : fruit.name, calories : fruit.calories })
    .filter(function(obj) { return obj.calories < 100 })
    .reduce(function (accumulator, obj) { accumulator + "\n" + val.name; });

这是巧合,还是可以证明合理的语义对等?大概如何?

我知道在实践中SQL有很多麻烦,但其核心是它只是map-fold-filter操作吗?

以下文章是相关的:http : //blogs.msdn.com/b/doriancorompt/archive/2013/01/21/bringing-the-querying-power-of-sql-to-javascript.aspx


1
您将如何建模JOIN或GROUP BY子句?
Ixrec

1
@Ixrec:像这样
梅森·惠勒

2
gnat-如果您阅读其他文章,您会看到他们告诉我该问题不适合Stackoverflow,因此我在此发布。有时候,您不能凭借Stackoverflow获胜。帖子被关闭是因为不合适,在错误的论坛中或者过于复杂以至于不适合该网站,或者很容易就应该使用Google。
Sridhar Sarnobat

1
哦,我应该删除其他帖子。做完了
Sridhar Sarnobat

1
@ Sridhar-Sarnobat:通常,当一堆用户投票将您的问题迁移到Programmers.SE时,它将自动被迁移。您已关闭问题,但未达到必需的5票。
布赖恩

Answers:


6

看看LINQ,它采用了SQL背后的基本概念,并将其概括为面向对象的编程。所述Where操作者是一个沼泽标准过滤器,所述Select操作者是一个投影/地图,等等。所有基本的SQL查询操作均以LINQ表示,并使用高阶函数实现,因此,是的,您对SQL的直观理解是正确的。

您所获得的示例与关系数据库的工作方式之间的最大区别是,在设计SQL时考虑到的命令集非常有限。它不是图灵完备的,数据库设计人员知道它可以做什么,不能做什么,这比起简单地Map枚举数据集可以使他们更轻松地设计系统以最大程度地优化查询。逐个元素。


这仅说明可以使用高阶函数来实现SQL操作,而不是通常这两者是相互关联的。
Bart van Ingen Schenau 2015年

1
@Bart:那么问题是“是否存在可以证明的合理的语义对等?” 从一件事到另一件事的实现是一种久经考验的技术,用于证明计算机科学的等效性。例如,通过一种语言来实现另一种已知为图灵完成的语言,从而证明该语言是图灵完成的。
梅森惠勒

对于语义对等,我希望您可以在两个方向上都可以看到它。可以使用高阶函数来表示SQL查询,也可以使用SQL语法来表示高阶函数。
Bart van Ingen Schenau 2015年

2
也许我没有足够正式地表达这个问题。我想在100%的情况下不需要双向等效。只是通过一种方法的典型查询可以改写为另一种方法。
Sridhar Sarnobat

2
公平地说,OP确实将问题表述为“ SQL 查询是否等效于高阶函数”,而不是“ SQL 语言等效于函数式编程语言”,因此答案均不正确。
Ixrec

9

SQL基于关系代数和元组关系演算,而不是高阶函数或函数式编程。尽管SELECT,FROM和WHERE在其他语言中具有类似的功能,但SQL本身不支持通用的高阶函数,而仅支持语言本身定义的那些“高阶”函数。

由于SQL不允许您编写自己的自定义高阶函数,因此不能以任何权限说该语言支持高阶函数。


关系代数/微积分是否与函数式编程有关?我认为关系语言是从集合论派生而来的,但不确定是否可以使它们起作用。
Sridhar Sarnobat 2015年

1
这就是为什么“高阶”用引号引起来的原因。
罗伯特·哈维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.