web-dev-qa-db-ja.com

(基本的な)SQLクエリは、意味的に高次関数と同等ですか?

SQLは基本的にマップ+フォールド+フィルターのドメイン固有のインスタンスですか?

次のSQLのようです:

SELECT name
FROM fruits
WHERE calories < 100 

これは、次のマップ+フィルター+折りたたみ操作の構文糖衣です。

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

11

[〜#〜] linq [〜#〜] を見てください。これは、SQLの背後にある基本概念を取り入れ、オブジェクト指向プログラミングに一般化しています。 Where演算子は沼地の標準フィルターであり、Select演算子はプロジェクション/マップなどです。すべての基本的なSQLクエリ操作はLINQで表され、高次関数を使用して実装されているため、そうです、SQLの直感的な理解は正しいです。

これまでの例とリレーショナルデータベースの動作の大きな違いは、SQLは非常に限られた一連のコマンドを考慮して設計されていることです。それはチューリング完全ではなく、データベース設計者はそれができることとできないことを知っているので、単純なMapデータセットを要素ごとに列挙します。

6
Mason Wheeler

SQLは、高階関数や関数型プログラミングではなく、リレーショナル代数とタプルリレーショナル計算に基づいています。 SELECT、FROM、およびWHEREは他の言語でも類似の関数を持っていますが、SQL自体は一般化された高次関数をサポートしていませんが、言語自体が定義する「高次」関数のみをサポートしています。

SQLでは独自のカスタム高次関数を記述できないため、言語が高次関数をサポートしているとは言えません。

9
Robert Harvey