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

14

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

Ou pode ser que minha interpretação das notas 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 equivale a relação baseada em funcional ... ou talvez não entenda por que o fato de o SQL lidar com bancos de dados relacionais faz com que uma linguagem funcional seja implementada? (e por que 'baseado em relação' equivale a 'funcional' ao categorizar linguagens de programação?)

Obrigado :)

John
fonte

Respostas:

14

Estamos aprendendo que a maioria dos idiomas é classificada como uma das duas, "baseada em relação" ou "alto nível".

Esses conceitos são ortogonais. "Baseado em relação" significa que a semântica da linguagem é baseada no conceito de uma relação, ou seja, uma associação 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 o idioma contém muitas abstrações que ocultam muitos dos detalhes técnicos subjacentes (como localizações da memória, registros da CPU, acesso ao disco, operações bit a bit, etc.). O SQL certamente é baseado em relações, pois seu principal objetivo é descrever dados e operações relacionais. SQL também é um nível bastante alto; ele não fornece nenhum meio de acessar bytes no disco diretamente e não fornece detalhes sobre como ele armazena seus dados (pelo menos o SQL padrão não;

De fato, há muito mais eixos ao longo dos quais as linguagens de programação (e dados) podem ser classificadas; um particularmente interessante é declarativo versus imperativo . Linguagens declarativas descrevem o que é algo ; linguagens imperativas descrevem como fazer algo. A parte DDL de SQL é principalmente declarativa, apesar das palavras-chave para o futuro imperativas (" CREATE TABLE", ' DROP DATABASE', etc.), e até mesmo a parte de manipulação de dados ( SELECT, UPDATE, INSERT, DELETE) ainda é bastante declarativa. Uma propriedade muito interessante do SQL é que ele não está completo: você não pode gravar um loop ilimitado no SQL ANSI padrão comum.

A programação funcional concentra-se em algumas idéias principais:

  • funções são cidadãos de primeira classe (ou seja, podem ser usadas 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 que não sejam const. As funções puras são especialmente interessantes porque sempre produza a mesma saída, com as mesmas entradas)

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

tdammers
fonte
O ANSI SQL está completo com Turing. Você pode incorporar um sistema de tags cíclicas usando CTEs (introduzidas no SQL: 1999) e Windowing (SQL: 2003).
Jörg W Mittag
@ JörgWMittag: pode ser capaz de fazer algo semelhante com gatilhos ...
jmoreno
"Baseado em relação significa que a semântica da linguagem é baseada no conceito de uma relação, ou seja, uma associação muitos para muitos entre dois conjuntos (as relações são a base matemática por trás das tabelas SQL)" - Uma relação, em um RDBMS , não é o "relacionamento" entre conjuntos de dados, é um conjunto de tuplas. Uma tabela, uma exibição ou o resultado de uma consulta são todos "relações".
David Aldridge
12

O SQL não é imperativo porque o processo de COMO as consultas e os relacionamentos são resolvidos não são definidos pelo programador, mas pelo compilador / otimizador / intérprete. SQL é uma linguagem declarativa - no SQL, você declara relacionamentos. Isso cria uma estrutura de dados (que novamente não é definida fisicamente com o idioma, 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 na medida em que não têm efeitos colaterais.

A coisa toda está envolvida no modelo relacional .

Matthew Flynn
fonte
Eu acho que você pode fazer um argumento mais forte. As consultas são conjuntos, mas também são funções em conjuntos. As consultas são objetos de primeira classe no sql (em particular, você pode aninha-los ou nomeá-los) #
nomen
5

O SQL não é realmente tanto uma 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.

Yuriy Zubarev
fonte
1
Mas consultas (instruções select) são funções (matemáticas puras) e objetos de primeira classe no idioma. Isso torna o idioma funcional.
Nome da
3

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

Eu nunca ouvi falar de linguagens de programação como sendo divididas entre "baseado em relação" e "alto nível". Nível baixo / Nível alto é geralmente usado para distinguir assembler e C das 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 apóie as relações é de alto nível por definição.

O SQL puro é geralmente descrito como uma linguagem declarativa, com alguns bits processuais abordados por vários fornecedores. O fato de o SQL não suportar funções como variáveis ​​me parece desqualificá-lo imediatamente de ser uma linguagem funcional.

Charles E. Grant
fonte
As consultas são funções puras em conjuntos / relações e são objetos de primeira classe no idioma. Ipso facto funcional.
Nome da
1

O SQL é uma linguagem relacional baseada em conjunto que teve a funcionalidade processual abordada.

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

Jonathan Rich
fonte
-1

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

Eu acho que a álgebra de relação é 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, não sei se ele poderia ser estendido para uma linguagem funcional completa de uma maneira uniforme, não sou especialista neste campo. Haskell tem algumas bibliotecas com o objetivo de linguagens de banco de dados de nível muito alto.

physis
fonte
-1

Não conheço todas as subtilidades do que é necessário para que um idioma seja qualificado 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. É chamado de Aplicar. Quando expliquei isso a 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 o conjunto de atributos da linha de uma tabela ou da função da tabela como entrada para outra função. Dito isto, impus uma restrição ao tipo de função da tabela a ser escrita para ser considerada funcional. O deve ser declarado como embutido, o que significa que está sendo expresso como uma única instrução de seleção. Isso impõe não ter variáveis. Tais consultas com muita lógica podem ser escritas, desde que você use expressões comuns de tabela que permitem transformar expressões em coluna, um tipo de variável imutável que pode ser reutilizada em outro CTE. No final, a função.f torna-se uma macro muito grande, que torna o otimizador livre para otimizar da maneira que precisa. A única coisa que falta às pessoas são alguns truques simples para escrever lógica condicional e declarou alguns dados que suportam a lógica na consulta. Por último, são necessárias algumas funções que usam a cláusula over, como forma de continuar os resultados como um valor utilizável em uma linha de outras linhas, mas seria um pouco longo para ser elaborado aqui. A única coisa que falta às pessoas são alguns truques simples para escrever lógica condicional e declarar alguns dados que suportam a lógica na consulta. Por último, são necessárias algumas funções que usam a cláusula over, como forma de continuar os resultados como um valor utilizável em uma linha de outras linhas, mas seria um pouco longo para ser elaborado aqui. A única coisa que falta às pessoas são alguns truques simples para escrever lógica condicional e declarar alguns dados que suportam a lógica na consulta. Por último, são necessárias algumas funções que usam a cláusula over, como forma de continuar os resultados como um valor utilizável em uma linha de outras linhas, mas seria um pouco longo para ser elaborado aqui.

Maurice Pelchat
fonte