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


11

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には多くの標準的な機能があることはわかっていますが、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


2
gnat-他の投稿を読むと、質問がStackoverflowには不適切であると彼らが私に言ったことがわかりますので、後でここに投稿しました。Stackoverflowで勝てないことがあります。投稿が不適切である、間違ったフォーラムにある、または複雑すぎてこのサイトに適さないために閉じられているか、Googleを使用したほうが簡単であるかのいずれかです。
Sridhar Sarnobat

1
あ、他の投稿は削除することになっています。できました。
Sridhar Sarnobat

1
@ Sridhar-Sarnobat:通常、多数のユーザーが質問をProgrammers.SEに移行することに投票すると、自動的に移行されます。必要な5票に達する前に質問を閉じました。
Brian

回答:


6

SQLの背後にある基本的な概念を取り入れ、それをオブジェクト指向プログラミングに一般化したLINQをご覧ください。Whereオペレータは、BOG標準フィルタでSelect操作者が投影/マップなどです。すべての基本的なSQLクエリ操作はLINQで表され、高次関数を使用して実装されているため、そうです、SQLの直感的な理解は正しいです。

これまでの例とリレーショナルデータベースの動作の大きな違いは、SQLは非常に限られた一連のコマンドを考慮して設計されていることです。それはチューリング完全ではなく、データベース設計者はそれができることとできないことを知っているのでMap、データセットを列挙するだけの場合よりもはるかに高度にクエリを最適化するシステムを設計することがはるかに簡単になります要素ごと。


これは、SQL操作を実現するために高次関数を使用できることを示すだけであり、2つが一般に互いに関連していることを示しているわけではありません。
Bart van Ingen Schenau

1
@バート:それから質問は「証明できる健全な意味論的同等性はあるか?」でした。あるものを別のものとして実装することは、コンピュータサイエンスで同等性を証明するための古くからの手法です。たとえば、チューリング完全であることがすでにわかっている別の言語を実装するためにそれを使用して、言語がチューリング完全であることを証明する1つの方法。
メイソンウィーラー、2015年

セマンティック同値の場合、双方向で表示できると思います。SQLクエリは高次関数で表現でき、SQL構文で高次関数を表現できます。
Bart van Ingen Schenau、2015年

2
たぶん私は質問を正式に十分に述べなかったでしょう。100%のケースで双方向的に同等である必要はないと思います。あるアプローチによる典型的なクエリを別のアプローチに書き換えることができるというだけです。
Sridhar Sarnobat

2
公平を期すために、OPは質問を「SQL クエリは高次関数と同等である」ではなく「SQL 言語は関数型プログラミング言語と同等である」と表現したので、どちらの答えも間違っていません。
Ixrec 2015年

9

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

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


関係代数/微積分は関数型プログラミングに関連していますか?リレーショナル言語は集合論から派生していると思いますが、それが機能するかどうかはわかりません。
Sridhar Sarnobat

1
これが、「高次」が恐ろしい引用である理由です。
Robert Harvey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.