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.
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 .
fonte
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.
fonte
É 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.
fonte
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.
fonte
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.
fonte
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.
fonte