¿Por qué se conoce a SQL como un lenguaje basado en relaciones / funcional?

14

Estamos aprendiendo que la mayoría de los idiomas se clasifican como uno de los dos, "basado en relación" o "alto nivel". Nunca he usado SQL antes, pero al leer su sintaxis parece más una sintaxis imperativa / de alto nivel que funcional / basada en la relación (Lisp, Haskell) ??

O simplemente podría ser que mi interpretación de las notas de la clase de mi profesor sea incorrecta ... pero definitivamente enumera a SQL como uno de los lenguajes basados en relaciones (en oposición a un nivel alto), y compara el basado en relaciones con funcional ... o tal vez es que no entiendo por qué el hecho de que SQL trate con bases de datos relacionales hace que un lenguaje funcional sea la forma en que debe implementarse. (¿Y por qué 'basado en relaciones' equivale a 'funcional' al categorizar lenguajes de programación?)

Gracias :)

    
pregunta John 08.02.2012 - 18:09

7 respuestas

14
  

Estamos aprendiendo que la mayoría de los idiomas se clasifican como uno de los dos, "basado en relación" o "nivel alto".

Esos conceptos son ortogonales. "Basado en relaciones" significa que la semántica del lenguaje se basa en el concepto de una relación, es decir, una asociación de muchos a muchos entre dos conjuntos (las relaciones son la base matemática detrás de las tablas SQL). "Nivel alto" significa que el lenguaje contiene una gran cantidad de abstracciones que ocultan gran parte de los detalles técnicos subyacentes (como ubicaciones de memoria, registros de CPU, acceso a discos, operaciones bitwise, etc.). SQL es ciertamente basado en relaciones, ya que su propósito principal es describir datos relacionales y operaciones sobre él. SQL también es bastante alto nivel; no proporciona ningún medio para acceder a los bytes en el disco directamente, y no le proporciona ningún detalle sobre cómo almacena sus datos (al menos el estándar SQL no lo hace; la mayoría de los proveedores proporcionan extensiones al estándar que pueden proporcionarle bastante información, pero eso no viene al caso).

De hecho, hay muchos más ejes a lo largo de los cuales se pueden clasificar los lenguajes de programación (y datos); uno particularmente interesante es declarativo contra imperativo . Los lenguajes declarativos describen lo que es algo ; Los lenguajes imperativos describen cómo hacer algo. La parte DDL de SQL es en su mayoría declarativa, a pesar de las palabras clave de aspecto imperativo (" CREATE TABLE ", " DROP DATABASE ", etc.) e incluso la parte de manipulación de datos ( SELECT , UPDATE , INSERT , DELETE ) sigue siendo bastante declarativo. Una propiedad muy interesante de SQL es que no está completa Turing: no puede escribir un bucle ilimitado en el ANSI SQL estándar simple.

La programación funcional se centra en algunas ideas centrales:

  • las funciones son ciudadanos de primera clase (es decir, se pueden usar como valores, como entradas para otras funciones y como salida de otras funciones)
  • funciones de orden superior (funciones que operan en funciones o funciones que devuelven funciones)
  • pureza (una función pura es aquella que no tiene efectos secundarios; una función pura no puede hacer ninguna E / S, no puede leer ni modificar ningún estado global, y no puede tomar argumentos de referencia no const. Las funciones puras son especialmente interesantes porque siempre producirán la misma salida dadas las mismas entradas)

Ciertamente, SQL no gira en torno a las funciones como la herramienta principal para modelar cosas, pero en cierto modo abarca la idea de pureza: la misma consulta ejecutada en la misma base de datos producirá el mismo resultado, cada vez (excepto para ordenar). Llamar a SQL como un lenguaje 'funcional' es un poco exagerado aunque IMO.

    
respondido por el tdammers 08.02.2012 - 20:35
12

SQL no es imprescindible porque el proceso de CÓMO se resuelven las consultas y las relaciones no están definidos por el programador, sino por el compilador / optimizador / intérprete. SQL es un lenguaje declarativo : en SQL, declara las relaciones. Esto crea una estructura de datos (que de nuevo no se define físicamente con el lenguaje sino por su implementación) mediante inserciones, actualizaciones y eliminaciones.

El uso de las relaciones se realiza mediante consultas (sentencias SELECT), que son funcionales en el sentido de que no tienen efectos secundarios.

Todo se envuelve alrededor del modelo relacional .

    
respondido por el Matthew Flynn 08.02.2012 - 18:39
5

SQL no es realmente tanto lenguaje funcional como declarativo. Los lenguajes funcionales, en general, enfatizan el estilo declarativo sobre el imperativo para minimizar los efectos secundarios. Esto podría llevar a algunas personas a referirse a SQL como funcional, pero no es preciso. Es declarativo con elementos procesales.

    
respondido por el Yuriy Zubarev 08.02.2012 - 18:36
3

¿Es posible que tus notas estén revueltas?

Nunca he oído hablar de los lenguajes de programación como divididos entre "basado en relaciones" y "alto nivel". Nivel bajo / Nivel alto se usa generalmente para distinguir ensamblador y C de los idiomas que proporcionan soporte directo para estructuras más abstractas. Las relaciones son una estructura bastante abstracta, por lo que diría que cualquier cosa que apoye las relaciones es de alto nivel por definición.

El SQL puro generalmente se describe como un lenguaje declarativo, con algunos bits de procedimiento adheridos por los distintos proveedores. El hecho de que SQL no admita las funciones como variables me parece que lo descalifica de inmediato para ser un lenguaje funcional.

    
respondido por el Charles E. Grant 08.02.2012 - 18:43
1

SQL es un lenguaje relacional basado en conjuntos en el que se ha implementado una funcionalidad de procedimiento.

No sé si consideraría el funcionamiento de SQL, sin embargo, tiene algunos aspectos de los lenguajes funcionales. Las variantes modernas de SQL (con los bits de procedimiento) definitivamente no son funcionales.

    
respondido por el Jonathan Rich 08.02.2012 - 18:30
-1

Creo que, SQL es un azúcar sintáctico alrededor del álgebra relacional + algo más. El álgebra relacional tiene una gran cantidad de poder de lenguajes funcionales, de hecho aprovecha funciones de muy alto poder de expresión (selección, proyección, cambio de nombre, unión, unión, intersección ...). Pero por lo que sé, el tratamiento básico del álgebra relacional generalmente no tiene un equivalente de operador lambda, aunque puede extenderse con un operador de recursión de manera transparente.

Creo que el álgebra de relaciones es más bien un lenguaje algebraico. SQL, con sus subconsultas, ha pasado del álgebra relacional pura a un estilo más funcional, pero sin un operador lambda, creo que no es un lenguaje funcional completo. No sé si podría extenderse a un lenguaje funcional completo de una manera fluida, no soy experto en este campo. Haskell tiene algunas bibliotecas con el objetivo de lenguajes de base de datos de muy alto nivel.

    
respondido por el physis 30.03.2015 - 11:52
-1

No conozco todas las sutilezas de lo que se necesita para que un idioma se califique como funcional, pero el Servidor SQL presentó una forma muy interesante de trabajar con funciones. Una cláusula especial hace que las funciones puedan interactuar juntas en una consulta. Se llama aplicar. Cuando le expliqué eso a un ex programador de APL, él me dijo que existía una cláusula similar en APL para un objetivo similar. La cláusula de aplicación permite pasar un conjunto de atributos de la fila de una tabla o la fila de la función de tabla como entrada a otra función. Dicho esto, impuse una restricción en el tipo de función de tabla para escribir para que se considere funcional. Se debe declarar como en línea, lo que significa que se expresa como una sola declaración de selección. Esto impone no tener variables. Dichas consultas con mucha lógica pueden escribirse siempre que use expresiones de tabla comunes que luego permitan convertir expresiones en columnas, un tipo de variable no modificable que se puede reutilizar en otras CTE. Al final, the.function se convierte en una macro muy grande que hace que el optimizador sea gratuito para optimizar la forma en que lo necesita. Lo único que le falta a la gente son algunos trucos simples para escribir lógica condicional y declaró algunos datos que respaldan la lógica en la consulta. Por último, algunas funciones que usan la cláusula sobre se necesitan como una forma de llevar los resultados como un valor utilizable en una fila de otras filas, pero sería un poco largo para elaborar aquí.

    
respondido por el Maurice Pelchat 28.11.2016 - 05:35

Lea otras preguntas en las etiquetas