¿Las consultas SQL (básicas) son semánticamente equivalentes a las funciones de orden superior?


11

¿SQL es básicamente una instancia específica de dominio de map + fold + filter?

Me parece que el siguiente SQL:

SELECT name
FROM fruits
WHERE calories < 100 

es solo azúcar sintáctico para la siguiente operación de mapa + filtro + plegado:

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

¿Es una coincidencia o hay una sólida equivalencia semántica que se puede probar? ¿Cómo, más o menos?

Sé que en la práctica, SQL tiene muchas campanas y silbatos, pero en el fondo ¿es simplemente una operación de filtro de plegado de mapa?

El siguiente artículo es relevante: http://blogs.msdn.com/b/doriancorompt/archive/2013/01/21/bringing-the-querying-power-of-sql-to-javascript.aspx


1
¿Cómo modelaría una cláusula JOIN o GROUP BY?
Ixrec


2
mosquito - Si lees la otra publicación, verás que me dijeron que la pregunta era inapropiada para Stackoverflow, así que luego publiqué aquí. No puedes ganar con Stackoverflow a veces. O la publicación se cierra por ser inapropiada, en el foro equivocado o demasiado compleja, por lo que no es adecuada para este sitio, o es tan fácil que debería haber utilizado Google.
Sridhar Sarnobat

1
Oh, se supone que debo eliminar la otra publicación. Hecho.
Sridhar Sarnobat

1
@ Sridhar-Sarnobat: Normalmente, cuando un grupo de usuarios vota para migrar su pregunta a Programmers.SE, se migrará automáticamente. Cerró su pregunta antes de que alcanzara los 5 votos requeridos.
Brian

Respuestas:


6

Eche un vistazo a LINQ , que toma los conceptos básicos detrás de SQL y lo generaliza a la programación orientada a objetos. El Whereoperador es un filtro estándar de pantano, el Selectoperador es una proyección / mapa, y así sucesivamente. Todas las operaciones básicas de consulta SQL están representadas en LINQ, implementadas usando funciones de orden superior, por lo que sí, tiene razón en su comprensión intuitiva de SQL.

La gran diferencia entre el ejemplo que tiene y la forma en que funciona una base de datos relacional es que SQL está diseñado con un conjunto muy limitado de comandos en mente. No es completo para Turing y los diseñadores de bases de datos saben lo que pueden y no pueden hacer, lo que les facilita mucho diseñar el sistema para optimizar las consultas en un grado mucho mayor de lo que sería posible con una simple Mapenumeración de un conjunto de datos. elemento por elemento.


Esto solo demuestra que las funciones de orden superior pueden usarse para realizar operaciones SQL, no que las dos estén relacionadas entre sí en general.
Bart van Ingen Schenau

1
@Bart: Entonces la pregunta era "¿hay una equivalencia semántica sólida que pueda probarse?" Implementar una cosa en términos de otra es una técnica tradicional para probar la equivalencia en ciencias de la computación. Por ejemplo, una forma de demostrar que un lenguaje es Turing completo usándolo para implementar otro idioma que ya se sabe que es Turing completo.
Mason Wheeler

Para una equivalencia semántica, esperaría que pueda mostrarla en ambas direcciones. Tanto las consultas SQL pueden expresarse en funciones de orden superior como que puede expresar una función de orden superior en sintaxis SQL.
Bart van Ingen Schenau

2
Tal vez no formulé la pregunta formalmente. Supongo que no necesito que sea bidireccionalmente equivalente en el 100% de los casos. Solo que las consultas típicas a través de un enfoque pueden reescribirse como otro.
Sridhar Sarnobat

2
Para ser justos, el OP formuló la pregunta como "son consultas SQL equivalentes a funciones de orden superior", no "es el lenguaje SQL equivalente a un lenguaje de programación funcional", por lo que ninguna de las respuestas es incorrecta.
Ixrec

9

SQL se basa en álgebra relacional y cálculo relacional de tuplas, no en funciones de orden superior o programación funcional. Si bien SELECT, FROM y WHERE tienen funciones análogas en otros lenguajes, el propio SQL no admite funciones generalizadas de orden superior, sino solo aquellas funciones de "orden superior" que el propio lenguaje define.

Dado que SQL no le permite escribir sus propias funciones personalizadas de orden superior, no se puede decir con ninguna autoridad que el lenguaje admite funciones de orden superior.


¿El álgebra / cálculo relacional está relacionado con la programación funcional? Creo que los lenguajes relacionales se derivan de la teoría de conjuntos, pero no estoy seguro de si eso los hace funcionales.
Sridhar Sarnobat

1
Es por eso que "orden superior" está entre comillas.
Robert Harvey
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.