As consultas SQL (básicas) são semanticamente equivalentes às Funções de Ordem Superior?


11

O SQL é basicamente uma instância específica de domínio do mapa + dobra + filtro?

Parece-me que o seguinte SQL:

SELECT name
FROM fruits
WHERE calories < 100 

é apenas açúcar sintático para a seguinte operação de mapa + filtro + dobra:

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

Isso é coincidência ou existe uma equivalência semântica sólida que possa ser comprovada? Como, aproximadamente?

Eu sei que, na prática, o SQL tem muitos sinos e assobios, mas em sua essência é simplesmente uma operação de filtro de dobra de mapa?

O seguinte artigo é relevante: http://blogs.msdn.com/b/doriancorompt/archive/2013/01/21/bringing-the-querying-power-of-sql-to-javascript.aspx


1
Como você modelaria uma cláusula JOIN ou GROUP BY?
Ixrec


2
gnat - Se você ler o outro post, verá que eles me disseram que a pergunta era inapropriada para o Stackoverflow, então eu postei aqui. Você não pode ganhar com o Stackoverflow às vezes. A postagem é fechada por ser inadequada, no fórum errado ou muito complexa, de modo que não é adequada para este site, ou é tão fácil que você deveria ter usado o Google.
Sridhar Sarnobat

1
Ah, eu devo excluir a outra postagem. Feito.
Sridhar Sarnobat

1
@ Sridhar-Sarnobat: Normalmente, quando vários usuários votam para migrar sua pergunta para o Programmers.SE, ela será automaticamente migrada. Você encerrou sua pergunta antes que ela atingisse os 5 votos necessários.
Brian

Respostas:


6

Dê uma olhada no LINQ , que pega os conceitos básicos por trás do SQL e o generaliza para a programação orientada a objetos. O Whereoperador é um filtro padrão do pântano, o Selectoperador é uma projeção / mapa e assim por diante. Todas as operações básicas de consulta SQL são representadas no LINQ, implementadas usando funções de ordem superior; portanto, você está correto no seu entendimento intuitivo do SQL.

A grande diferença entre o exemplo que você tem e a maneira como um banco de dados relacional funciona é que o SQL é projetado com um conjunto muito limitado de comandos em mente. Não está completo em Turing e os projetistas de banco de dados sabem o que pode e o que não pode fazer, o que facilita muito o design do sistema para otimizar as consultas em um grau muito maior do que seria possível com uma simples Mapenumeração de um conjunto de dados. elemento por elemento.


Isso demonstra apenas que funções de ordem superior podem ser usadas para realizar operações SQL, não que as duas estejam relacionadas uma à outra em geral.
Bart van Ingen Schenau

1
@ Bart: Então a pergunta era "existe uma equivalência semântica de som que pode ser comprovada?" Implementar uma coisa em termos de outra é uma técnica consagrada pelo tempo para provar equivalência na ciência da computação. Por exemplo, uma maneira de provar que um idioma é completo em Turing usando-o para implementar outro idioma que já é conhecido como completo em Turing.
Mason Wheeler

Para uma equivalência semântica, eu esperaria que você possa mostrá-lo nas duas direções. As consultas SQL podem ser expressas em funções de ordem superior e você pode expressar uma função de ordem superior na sintaxe SQL.
Bart van Ingen Schenau

2
Talvez eu não tenha formulado a pergunta formalmente o suficiente. Acho que não preciso que ele seja bidirecionalmente equivalente em 100% dos casos. Só que as consultas típicas através de uma abordagem podem ser reescritas como outra.
Sridhar Sarnobat

2
Para ser justo, o OP formulou a pergunta como "são consultas SQL equivalentes a funções de ordem superior", não "é a linguagem SQL equivalente a uma linguagem de programação funcional"; portanto, nenhuma resposta está errada.
Ixrec

9

O SQL é baseado em Álgebra relacional e Cálculo relacional de tupla, não em funções de ordem superior ou em programação funcional. Enquanto SELECT, FROM e WHERE têm funções análogas em outros idiomas, o próprio SQL não suporta funções generalizadas de ordem superior, mas apenas as funções de "ordem superior" que a própria linguagem define.

Como o SQL não permite que você escreva suas próprias funções personalizadas de ordem superior, não se pode dizer com nenhuma autoridade que a linguagem suporta funções de ordem superior.


A álgebra / cálculo relacional está relacionada à programação funcional? Penso que as linguagens relacionais são derivadas da teoria dos conjuntos, mas não tenho certeza se isso as torna funcionais.
Sridhar Sarnobat

1
É por isso que "ordem superior" está entre aspas assustadoras.
Robert Harvey
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.