Le query SQL (di base) sono semanticamente equivalenti alle funzioni di ordine superiore?


11

SQL è fondamentalmente un'istanza specifica del dominio di map + fold + filter?

Mi sembra che il seguente SQL:

SELECT name
FROM fruits
WHERE calories < 100 

è solo zucchero sintattico per la seguente operazione mappa + filtro + piega:

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

È una coincidenza o esiste una solida equivalenza semantica che può essere dimostrata? Come, approssimativamente?

So in pratica che SQL ha molte campane e fischietti, ma al suo centro è semplicemente un'operazione di filtro piega mappa?

Il seguente articolo è pertinente: http://blogs.msdn.com/b/doriancorompt/archive/2013/01/21/bringing-the-querying-power-of-sql-to-javascript.aspx


1
Come modelleresti una clausola JOIN o GROUP BY?
Ixrec,

1

2
gnat - Se leggi l'altro post, vedrai che mi hanno detto che la domanda era inappropriata per Stackoverflow, quindi dopo ho pubblicato qui. A volte non puoi vincere con StackOverflow. O il post viene chiuso per essere inappropriato, nel forum sbagliato o troppo complesso, quindi non adatto a questo sito, oppure è così facile che avresti dovuto semplicemente utilizzare Google.
Sridhar Sarnobat,

1
Oh, dovrei cancellare l'altro post. Fatto.
Sridhar Sarnobat,

1
@ Sridhar-Sarnobat: normalmente, quando un gruppo di utenti vota per migrare la tua domanda su Programmers.SE, verrà automaticamente migrata. Hai chiuso la domanda prima che raggiungesse i 5 voti necessari.
Brian,

Risposte:


6

Dai un'occhiata a LINQ , che prende i concetti di base dietro SQL e lo generalizza alla programmazione orientata agli oggetti. L' Whereoperatore è un filtro standard di torbiera, l' Selectoperatore è una proiezione / mappa e così via. Tutte le operazioni di query SQL di base sono rappresentate in LINQ, implementate utilizzando funzioni di ordine superiore, quindi sì, sei corretto nella tua comprensione intuitiva di SQL.

La grande differenza tra l'esempio che hai e il modo in cui funziona un database relazionale è che SQL è progettato tenendo presente un set di comandi molto limitato. Non è Turing completo e i progettisti di database sanno cosa può e non possono fare, il che rende molto più facile per loro progettare il sistema per ottimizzare le query in misura molto maggiore di quanto sarebbe possibile con una semplice Mapenumerazione di un set di dati elemento per elemento.


Ciò dimostra solo che le funzioni di ordine superiore possono essere utilizzate per realizzare operazioni SQL, non che le due siano correlate tra loro in generale.
Bart van Ingen Schenau,

1
@Bart: Allora la domanda era "esiste una solida equivalenza semantica che può essere dimostrata?" L'implementazione di una cosa in termini di un'altra è una tecnica consolidata per dimostrare l'equivalenza nell'informatica. Ad esempio, un modo per dimostrare che una lingua è Turing completa utilizzandola per implementare un'altra lingua che è già nota per essere Turing completa.
Mason Wheeler,

Per un'equivalenza semantica, mi aspetto che tu possa mostrarlo in entrambe le direzioni. Sia le query SQL che possono essere espresse in funzioni di ordine superiore e che è possibile esprimere una funzione di ordine superiore nella sintassi SQL.
Bart van Ingen Schenau,

2
Forse non ho formulato la domanda abbastanza formalmente. Immagino di non averne bisogno per essere bidirezionalmente equivalente nel 100% dei casi. Solo che le query tipiche attraverso un approccio possono essere riscritte come un altro.
Sridhar Sarnobat,

2
Per essere onesti, l'OP ha formulato la domanda come "sono query SQL equivalenti a funzioni di ordine superiore", non "è il linguaggio SQL equivalente a un linguaggio di programmazione funzionale", quindi nessuna risposta è errata.
Ixrec,

9

SQL si basa sull'algebra relazionale e sul calcolo relazionale tupla, non su funzioni di ordine superiore o sulla programmazione funzionale. Mentre SELECT, FROM e WHERE hanno funzioni analoghe in altre lingue, SQL stesso non supporta funzioni di ordine superiore generalizzate, ma solo quelle funzioni di "ordine superiore" che il linguaggio stesso definisce.

Poiché SQL non consente di scrivere le proprie funzioni personalizzate di ordine superiore, non si può dire con alcuna autorità che il linguaggio supporta funzioni di ordine superiore.


L'algebra / calcolo relazionale è assolutamente correlato alla programmazione funzionale? Penso che i linguaggi relazionali derivino dalla teoria degli insiemi, ma non sono sicuro che ciò li renda funzionali.
Sridhar Sarnobat,

1
Ecco perché "ordine superiore" è tra virgolette.
Robert Harvey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.