2009-07-20 29 views

Respuesta

1

En términos generales, como sin extensiones a la sintaxis (por ejemplo, PL/SQL, T-SQL), no puede escribir funciones.

Pero sin duda está muy orientado a la expresión, que es una característica que tiene en común con los lenguajes funcionales.

8

¿Están las funciones objetos de primera clase en SQL? apenas. Entonces yo diría que no.

+0

por definición - no, pero similar por la forma de pensar (y depurar) – ren

+1

Cada consulta SQL es una función. Tal vez simplemente no te gusta la sintaxis. –

+0

Sí, lo son ... SELECCIONAR es una función. Si lees sobre el álgebra relacional, sabrías que SELECCIÓN y PROYECCIÓN son funciones/acciones. Simplemente no lo ves escrito como 'Seleccionar (columnas/expresiones)'; –

0

Como el punto de un lenguaje funcional es que programes con, bueno, funciones, diría que no. SQL está programando con relaciones (si puede incluso llamar a SQL un lenguaje de programación, en su forma básica, SQL no está completo).

2

No existe una única definición verdadera de lo que es un lenguaje funcional (o para el caso, lo que es un procedimiento u orientado a objetos).

Pero realmente no puedo pensar en nada que apunte a SQL como funcional. No tiene funciones, no tiene recursión, no tiene cierres, no tiene funciones anidadas, no tiene funciones como tipos de primera clase.

Una pregunta más común es si SQL es un lenguaje de programación en total. No es turing-completo.

+1

+1 para el proceso no completo - Iba a agregar eso a mi respuesta :-( –

+1

El estándar SQL92 no está completo. El PL/SQL de Oracle y el T-SQL de SQL Server y otros están completos. –

+0

sí, pero la pregunta era sobre el SQL en sí, no sobre las extensiones de varios proveedores. – jalf

5

Creo que los lenguajes SQL y funcionales son muy diferentes entre sí. En un lenguaje funcional, el cálculo se realiza evaluando funciones. Las funciones no mutan el estado. Todo lo que hacen es calcular un valor a partir de sus argumentos. En otras palabras, las funciones no causan efectos secundarios. Los lenguajes funcionales son de propósito general.

SQL es un lenguaje diseñado para tratar con sistemas de administración de bases de datos relacionales. Se puede ver como un lenguaje específico del dominio. Está diseñado para trabajar en "conjuntos" de datos. Puede cambiar el estado global (es decir, la base de datos) mediante comandos como ACTUALIZAR. No existe el concepto de que las funciones se evalúen con un valor. Por lo que yo entiendo, SQL ni siquiera está completo.

+1

Los lenguajes funcionales tienen que causar efectos secundarios de alguna manera, ¿no? –

+0

Pero F # tiene estado, ¿correcto? –

21

SQL fue diseñado como un lenguaje declarativo, en el sentido que le diga a what desea obtener y el motor SQL decide how.

Sin embargo, SQL opera en conjuntos, y los resultados de las funciones pueden ser conjuntos de primera clase en Oracle, SQL Server y PostgreSQL.

Se puede decir que SQL es un lenguaje funcional, siempre que una función tome un conjunto como entrada y produzca un conjunto como salida.

Es decir, se puede escribir algo como esto:

SELECT * 
FROM mytable t 
JOIN myfunction(x) f 
ON  f.col1 = t.col2 

, o incluso esto:

SELECT * 
FROM mytable t 
CROSS APPLY 
     myfunction(t.col2) f 

(en SQL Server)

o esto:

SELECT t.*, myfunction(t.col2) 
FROM mytable t 

(enSin embargo, esto no es parte del estándar SQL.

Al igual que un compilador C++ trata de encontrar una manera óptima de multiplicar dos float s (en términos de álgebra normal), SQL optimizador trata de encontrar un equilibrio óptimo formas de multiplicar dos conjuntos (en términos de álgebra relacional).

En C++, simplemente escriba a * b y confíe en el compilador para generar un ensamblaje óptimo para esto.

En SQL, escriba SELECT * FROM a NATURAL JOIN b y confíe en el optimizador.

Sin embargo, con todas las declaraciones declaradas de SQL (sin juego de palabras), la mayoría de los optimizadores reales solo pueden hacer reescrituras de consultas muy básicas.

Say, sin optimizador Soy consciente de que es capaz de utilizar un mismo plan eficiente para esta consulta:

SELECT t1.id, t1.value, SUM(t2.value) 
FROM mytable t1 
JOIN mytable t2 
ON  t2.id <= t1.id 
GROUP BY 
     t1.id, t1.value 

y para éste:

SELECT id, value, SUM(t1.value) OVER (ORDER BY id) 
FROM mytable 

, por no hablar de más compleja consultas.

Es por eso que todavía necesita formular sus consultas para que utilicen un plan eficiente (sin dejar de producir el mismo resultado), lo que hace que SQL sea un poco menos lenguaje declarativo.

Recientemente he hecho su mensaje en mi blog sobre esto:

+0

para ser funcional, una función debería permitirse sin embargo, tome una función como entrada. Simplemente permitir que las funciones existan es apenas suficiente. – jalf

+4

@jalf: como en 'functionA (x) CROSS APPLY functionB (functionA.col1)'? – Quassnoi

5

declarativa y funcional? Eso sería una hoja de cálculo.

8

No, SQL no es un lenguaje funcional. El paradigma es algo diferente. Tenga en cuenta que hay otros tipos de lenguajes de programación declarativa además de funcional: el ejemplo canónico es la programación lógica y PROLOG.

Técnicamente, el álgebra relacional (la base teórica de SQL) no está realmente completa. Aunque los dialectos de SQL modernos añaden suficientes características de procedimiento para que uno pueda implementar procedimientos almacenados y estén completos en este nivel, una única consulta de SQL no es un cálculo completo. Relational Algebra tiene la propiedad de completar godel.La integridad de Godel implica la capacidad de expresar cualquier cálculo que pueda definirse en términos de cálculo de predicados de primer orden, básicamente lo que usted conocería como expresiones lógicas ordinarias.

Cuestiones relacionadas