Entsprechen (grundlegende) SQL-Abfragen semantisch Funktionen höherer Ordnung?

11

Ist SQL im Grunde eine domänenspezifische Instanz von map + fold + filter?

Es scheint mir, dass die folgende SQL:

SELECT name
FROM fruits
WHERE calories < 100 

ist nur syntaktischer Zucker für die folgende Map + Filter + Fold-Operation:

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; });

Ist das Zufall oder gibt es eine solide semantische Äquivalenz, die bewiesen werden kann? Wie ungefähr?

Ich weiß, dass SQL in der Praxis viele Schnickschnack hat, aber im Kern ist es einfach eine Map-Fold-Filter-Operation?

Der folgende Artikel ist relevant: http://blogs.msdn.com/b/doriancorompt/archive/2013/01/21/bringing-the-querying-power-of-sql-to-javascript.aspx

Sridhar Sarnobat
quelle
1
Wie würden Sie eine JOIN- oder eine GROUP BY-Klausel modellieren?
Ixrec
1
@Ixrec: Gefällt Ihnen dieses
Mason Wheeler
2
Mücke - Wenn du den anderen Beitrag liest, wirst du sehen, dass sie mir gesagt haben, dass die Frage für Stackoverflow ungeeignet ist, also habe ich danach hier gepostet. Mit Stackoverflow kann man manchmal nicht gewinnen. Entweder wird der Beitrag geschlossen, weil er unangemessen, im falschen Forum oder zu komplex ist, sodass er für diese Website nicht geeignet ist, oder es ist so einfach, dass Sie nur Google hätten verwenden sollen.
Sridhar Sarnobat
1
Oh, ich soll den anderen Beitrag löschen. Erledigt.
Sridhar Sarnobat
1
@ Sridhar-Sarnobat: Wenn eine Gruppe von Benutzern für die Migration Ihrer Frage zu Programmers.SE abstimmt, wird diese normalerweise automatisch migriert. Sie haben Ihre Frage geschlossen, bevor sie die erforderlichen 5 Stimmen erreicht hat.
Brian

Antworten:

6

Schauen Sie sich LINQ an , das die Grundkonzepte von SQL auf die objektorientierte Programmierung verallgemeinert. Der WhereOperator ist ein Moor-Standardfilter, der SelectOperator ist eine Projektion / Karte und so weiter. Alle grundlegenden SQL-Abfrageoperationen werden in LINQ dargestellt und mithilfe von Funktionen höherer Ordnung implementiert. Ja, Sie haben also ein korrektes intuitives Verständnis von SQL.

Der große Unterschied zwischen dem Beispiel, das Sie haben, und der Funktionsweise einer relationalen Datenbank besteht darin, dass SQL mit einem sehr begrenzten Satz von Befehlen entworfen wurde. Es ist nicht vollständig und die Datenbankdesigner wissen, was es kann und was nicht, was es für sie viel einfacher macht, das System so zu entwerfen, dass Abfragen in einem weitaus größeren Maße optimiert werden, als dies mit einer einfachen MapAufzählung eines Datensatzes möglich wäre Element für Element.

Mason Wheeler
quelle
Dies zeigt nur, dass Funktionen höherer Ordnung zum Realisieren von SQL-Operationen verwendet werden können, nicht, dass die beiden im Allgemeinen miteinander in Beziehung stehen.
Bart van Ingen Schenau
1
@Bart: Dann war die Frage: "Gibt es eine solide semantische Äquivalenz, die bewiesen werden kann?" Die Umsetzung einer Sache in Bezug auf eine andere ist eine altehrwürdige Technik, um die Gleichwertigkeit in der Informatik zu beweisen. Ein Weg, um zu beweisen, dass eine Sprache Turing-vollständig ist, besteht darin, eine andere Sprache zu implementieren, von der bereits bekannt ist, dass sie Turing-vollständig ist.
Mason Wheeler
Für eine semantische Äquivalenz würde ich erwarten, dass Sie sie in beide Richtungen zeigen können. Sowohl, dass SQL-Abfragen in Funktionen höherer Ordnung ausgedrückt werden können, als auch, dass Sie eine Funktion höherer Ordnung in der SQL-Syntax ausdrücken können.
Bart van Ingen Schenau
2
Vielleicht habe ich die Frage nicht formell genug formuliert. Ich glaube, ich brauche es nicht, um in 100% der Fälle bidirektional gleichwertig zu sein. Nur dass die typischen Abfragen durch einen Ansatz als ein anderer umgeschrieben werden können.
Sridhar Sarnobat
2
Um fair zu sein, hat das OP die Frage so formuliert, dass "SQL- Abfragen Funktionen höherer Ordnung entsprechen", nicht "Ist die SQL- Sprache einer funktionalen Programmiersprache äquivalent", sodass keine der beiden Antworten falsch ist.
Ixrec
9

SQL basiert auf relationaler Algebra und relationaler Tupelrechnung, nicht auf Funktionen höherer Ordnung oder funktionaler Programmierung. Während SELECT, FROM und WHERE analoge Funktionen in anderen Sprachen haben, unterstützt SQL selbst keine verallgemeinerten Funktionen höherer Ordnung, sondern nur die Funktionen "höherer Ordnung", die die Sprache selbst definiert.

Da Sie in SQL keine eigenen benutzerdefinierten Funktionen höherer Ordnung schreiben können, kann mit keiner Autorität gesagt werden, dass die Sprache Funktionen höherer Ordnung unterstützt.

Robert Harvey
quelle
Hat relationale Algebra / Kalkül überhaupt etwas mit funktionaler Programmierung zu tun? Ich denke, relationale Sprachen sind von der Mengenlehre abgeleitet, aber ich bin mir nicht sicher, ob sie dadurch funktionsfähig sind.
Sridhar Sarnobat
1
Aus diesem Grund steht "übergeordnete Ordnung" in erschreckenden Anführungszeichen.
Robert Harvey