Por que o SQL é conhecido como uma linguagem funcional / baseada em relação?

14

Estamos aprendendo que a maioria das linguagens é classificada como uma das duas, "baseada em relações" ou "alto nível". Eu nunca usei SQL antes, mas ao ler sua sintaxe parece mais com a sintaxe imperativa / de alto nível do que funcional / relation-based (Lisp, Haskell) ??

Ou pode ser que a minha interpretação das anotações de aula do meu professor esteja errada ... mas definitivamente lista o SQL como uma das linguagens baseadas em relações (em oposição ao alto nível), e equaciona a relação com o funcional ... ou talvez seja porque não entendo por que o fato de o SQL lida com bancos de dados relacionais torna uma linguagem funcional da maneira como deve ser implementada? (e por que "baseado em relações" equivale a "funcional" ao categorizar linguagens de programação?)

Obrigado :)

    
por John 08.02.2012 / 18:09
fonte

7 respostas

14

We're learning that most languages are classified as either of the two, "relation based" or "high level".

Esses conceitos são ortogonais. "Baseado em relação" significa que a semântica da linguagem é baseada no conceito de uma relação, isto é, uma associação de muitos para muitos entre dois conjuntos (as relações são a base matemática por trás das tabelas SQL). "Alto nível" significa que a linguagem contém muitas abstrações que escondem muitos dos detalhes técnicos subjacentes (como localizações de memória, registros da CPU, acesso ao disco, operações bit a bit etc.). O SQL é certamente baseado em relações, pois seu propósito principal é descrever dados e operações relacionais sobre ele. O SQL também é de nível razoavelmente alto; ele não fornece nenhum meio de acessar bytes diretamente no disco, e não lhe fornece detalhes sobre como ele armazena seus dados (pelo menos o SQL padrão não faz; a maioria dos fornecedores fornece extensões para o padrão que podem lhe dar bastante informação, mas isso é irrelevante).

Na verdade, existem muitos outros eixos ao longo dos quais linguagens de programação (e dados) podem ser classificadas; um particularmente interessante é declarativo vs. imperativo . Linguagens declarativas descrevem o que é ; linguagens imperativas descrevem como fazer algo. A parte DDL do SQL é principalmente declarativa, apesar das palavras-chave imperativas (" CREATE TABLE ", " DROP DATABASE ", etc.) e até mesmo da parte de manipulação de dados ( SELECT , UPDATE , INSERT , DELETE ) ainda é bastante declarativo. Uma propriedade muito interessante do SQL é que ele não é Turing completo: você não pode escrever um loop ilimitado no padrão ANSI SQL normal.

A programação

funcional centra-se em algumas ideias principais:

    As funções
  • são cidadãos de primeira classe (isto é, eles podem ser usados como valores, como entradas para outras funções e como saída de outras funções)
  • funções de ordem superior (funções que operam em funções ou funções que retornam funções)
  • pureza (uma função pura é aquela que não tem efeitos colaterais; uma função pura não pode fazer nenhuma E / S, não pode ler nem modificar nenhum estado global e não pode aceitar argumentos de referência não-const. Funções puras são especialmente interessantes porque eles sempre produzirão a mesma saída, considerando as mesmas entradas)

O SQL certamente não gira em torno das funções como a principal ferramenta para modelar as coisas, mas adota a idéia de pureza - a mesma consulta executada no mesmo banco de dados produzirá o mesmo resultado, toda vez (exceto para ordenação). Chamar SQL de uma linguagem 'funcional' é um pouco difícil, apesar da IMO.

    
por 08.02.2012 / 20:35
fonte
12

O SQL não é imperativo porque o processo de como as consultas e os relacionamentos são resolvidos não é definido pelo programador, mas sim pelo compilador / otimizador / intérprete. SQL é uma linguagem declarativa - Em SQL, você declara relacionamentos. Isso cria uma estrutura de dados (que, novamente, não é fisicamente definida com a linguagem, mas por sua implementação) usando inserções, atualizações e exclusões.

O uso das relações é feito usando consultas (instruções SELECT), que são funcionais porque não têm efeitos colaterais.

A coisa toda está em volta do modelo relacional .

    
por 08.02.2012 / 18:39
fonte
5

SQL não é tanto linguagem funcional quanto declarativa. As linguagens funcionais, em geral, enfatizam o estilo declarativo sobre o imperativo para minimizar os efeitos colaterais. Isso pode levar algumas pessoas a se referirem ao SQL como funcional, mas não é preciso. É declarativo com elementos processuais.

    
por 08.02.2012 / 18:36
fonte
3

É possível que suas anotações estejam embaralhadas?

Eu nunca ouvi falar de linguagens de programação como sendo divididas entre "relation based" e "high level". Nível baixo / Alto nível é geralmente usado para distinguir assembler e C de linguagens que fornecem suporte direto para estruturas mais abstratas. As relações são uma estrutura bastante abstrata, então eu diria que qualquer coisa que suporte relações é de alto nível por definição.

O Pure SQL geralmente é descrito como sendo uma linguagem declarativa, com alguns bits procedurais abordados pelos vários fornecedores. O fato de o SQL não suportar funções como variáveis parece desqualificar imediatamente que ele seja uma linguagem funcional.

    
por 08.02.2012 / 18:43
fonte
1

O SQL é uma linguagem relacional baseada em conjuntos que teve a funcionalidade procedural anexada.

Não sei se consideraria o SQL funcional, no entanto, tem alguns aspectos de linguagens funcionais. Variantes modernas de SQL (com os bits procedurais) definitivamente não são funcionais.

    
por 08.02.2012 / 18:30
fonte
-1

Eu acho que SQL é um açúcar sintático em torno de álgebra relacional + algo mais. A álgebra relacional tem muito poder de linguagens funcionais, na verdade alavanca funções de alto poder expressivo (seleção, projeção, renomeação, junção, união, intersecção ...). Mas, até onde eu sei, o tratamento básico da álgebra relacional geralmente não tem equivalente de operador lambda, embora possa ser estendido com um operador de recursão de uma maneira perfeita.

Eu acho que a álgebra de relações é mais uma linguagem algébrica. O SQL, com suas subconsultas, passou da álgebra relacional pura para um estilo mais funcional, mas sem um operador lambda, acho que não é uma linguagem funcional completa. Eu não sei se isso poderia ser estendido para uma linguagem funcional completa de uma maneira perfeita, eu não sou especialista neste campo. O Haskell tem algumas bibliotecas com o objetivo de linguagens de banco de dados de alto nível.

    
por 30.03.2015 / 11:52
fonte
-1

Eu não conheço todas as sutilezas do que é necessário para uma linguagem ser qualificada como funcional, mas o Sql Server introduziu uma maneira muito interessante de trabalhar com funções. Uma cláusula especial torna as funções capazes de interagir juntas em uma consulta. Isso é chamado de Aplicar. Quando me expliquei que, para um ex-programador de APL, ele me disse que uma cláusula semelhante existia no APL para um objetivo semelhante. A cláusula Apply permite passar um conjunto de atributos da linha de uma tabela ou função da tabela como entrada para outra função. Dito isto, impus uma restrição ao tipo de função de tabela para escrever para ser considerado funcional. O deve ser declarado como inline, o que significa que é expresso como uma declaração de seleção única. Isso impõe não ter variáveis. Tais consultas com muita lógica podem ser escritas, permitindo que você use expressões de tabelas comuns que, então, permitem transformar expressões em colunas, um tipo de variável unmutável que pode ser reutilizada em outros CTEs. No final, a função torna-se uma macro muito grande que torna o otimizador livre para otimizar a maneira que precisa. A única coisa que falta às pessoas são alguns truques simples para escrever lógica condicional e declarar alguns dados de suporte à lógica na consulta. Por último, algumas funções usando a cláusula over são necessárias como uma maneira de executar os resultados como um valor utilizável em uma linha de outras linhas, mas seria um pouco longo para elaborar aqui.

    
por 28.11.2016 / 05:35
fonte