Warum ist SQL als beziehungsbasierte / funktionale Sprache bekannt?

14

Wir lernen, dass die meisten Sprachen entweder als "beziehungsbasiert" oder "hoch" eingestuft werden. Ich habe SQL noch nie benutzt, aber nach dem Lesen seiner Syntax scheint es eher wie die imperative / übergeordnete Syntax als funktional / beziehungsbasiert zu sein (Lisp, Haskell)?

Oder es könnte einfach sein, dass meine Interpretation der Vorlesungsunterlagen meines Professors falsch ist ... aber es listet SQL definitiv als eine der beziehungsbasierten Sprachen auf (im Gegensatz zu High Level) und es setzt beziehungsbasierte mit funktionalen ... oder ist es vielleicht so, dass ich nicht verstehe, warum die Tatsache, dass SQL mit relationalen Datenbanken umgeht, eine funktionale Sprache so macht, wie sie implementiert werden sollte? (Und warum entspricht "beziehungsbasiert" bei der Kategorisierung von Programmiersprachen "funktional"?)

Vielen Dank :)

John
quelle

Antworten:

14

Wir lernen, dass die meisten Sprachen entweder als "beziehungsbasiert" oder "hoch" eingestuft werden.

Diese Konzepte sind orthogonal. "Relationsbasiert" bedeutet, dass die Semantik der Sprache auf dem Konzept einer Relation basiert, dh einer Viele-zu-Viele-Assoziation zwischen zwei Mengen (Relationen sind die mathematische Grundlage für SQL-Tabellen). "Hoch" bedeutet, dass die Sprache viele Abstraktionen enthält, die einen Großteil der zugrunde liegenden technischen Details (wie Speicherorte, CPU-Register, Plattenzugriff, bitweise Operationen usw.) verbergen. SQL ist sicherlich beziehungsbasiert, da sein Hauptzweck darin besteht, relationale Daten und Operationen darauf zu beschreiben. SQL ist auch ziemlich hoch; Es bietet keine Möglichkeit, direkt auf Bytes auf der Festplatte zuzugreifen, und es gibt keine Einzelheiten darüber an, wie die Daten gespeichert werden (zumindest in Standard-SQL ist dies nicht der Fall;

Tatsächlich gibt es viel mehr Achsen, entlang derer Programmiersprachen (und Daten) klassifiziert werden können. ein besonders interessanter ist deklarativ vs. imperativ . Deklarative Sprachen beschreiben, was etwas ist ; Imperative Sprachen beschreiben, wie man etwas macht. Die DDL - Teil von SQL ist meist deklarative trotz der Imperativ aussehende Schlüsselwörter (“ CREATE TABLE“, ‚ DROP DATABASE‘, etc.), und auch die Datenmanipulation Teil ( SELECT, UPDATE, INSERT, DELETE) ist immer noch ziemlich deklarative. Eine sehr interessante Eigenschaft von SQL ist, dass es nicht vollständig ist: Sie können in normalem ANSI-SQL keine unbegrenzte Schleife schreiben.

Die funktionale Programmierung konzentriert sich auf einige Kernideen:

  • Funktionen sind erstklassige Bürger (dh sie können als Werte, als Eingaben für andere Funktionen und als Ausgaben für andere Funktionen verwendet werden).
  • Funktionen höherer Ordnung (Funktionen, die auf Funktionen angewendet werden, oder Funktionen, die Funktionen zurückgeben)
  • Reinheit (eine reine Funktion hat keine Nebenwirkungen; eine reine Funktion kann keine E / A-Vorgänge ausführen, keinen globalen Status lesen oder ändern und keine nicht konstanten Referenzargumente akzeptieren. Reine Funktionen sind besonders interessant, weil sie dies tun.) immer die gleiche Ausgabe bei gleichen Eingaben erzeugen)

SQL dreht sich sicherlich nicht um Funktionen als Hauptwerkzeug für die Modellierung von Dingen, sondern um die Reinheitsidee. Dieselbe Abfrage, die in derselben Datenbank ausgeführt wird, liefert jedes Mal das gleiche Ergebnis (außer bei der Bestellung). SQL als "funktionale" Sprache zu bezeichnen, ist allerdings ein bisschen schwierig.

tdammers
quelle
ANSI SQL ist vollständig. Sie können ein zyklisches Tag-System mithilfe von CTEs (eingeführt in SQL: 1999) und Windows (SQL: 2003) einbetten .
Jörg W Mittag
@ JörgWMittag: könnte etwas ähnliches mit Triggern machen ...
jmoreno
"Relationsbasiert bedeutet, dass die Semantik der Sprache auf dem Konzept einer Relation basiert, dh einer Viele-zu-Viele-Assoziation zwischen zwei Mengen (Relationen bilden die mathematische Grundlage für SQL-Tabellen)." - Eine Relation in einem RDBMS ist nicht die "Beziehung" zwischen Datensätzen, es ist eine Menge von Tupeln. Eine Tabelle, eine Ansicht oder das Ergebnis einer Abfrage sind alles "Relationen".
David Aldridge
12

SQL ist nicht zwingend erforderlich, da der Prozess der Auflösung von Abfragen und Beziehungen nicht vom Programmierer, sondern vom Compiler / Optimierer / Interpreter festgelegt wird. SQL ist eine deklarative Sprache - In SQL deklarieren Sie Beziehungen. Dies baut eine Datenstruktur auf (die wiederum nicht physisch mit der Sprache, sondern durch ihre Implementierung definiert ist), indem sie Einfügungen, Aktualisierungen und Löschungen verwendet.

Die Verwendung der Beziehungen erfolgt dann mit Abfragen (SELECT-Anweisungen), die insofern funktionsfähig sind, als sie keine Nebenwirkungen haben.

Das Ganze dreht sich um das relationale Modell .

Matthew Flynn
quelle
Ich denke, Sie können einen stärkeren Fall machen. Abfragen sind Mengen, aber sie sind auch Funktionen für Mengen. Abfragen sind erstklassige Objekte in SQL (insbesondere, können Sie sie nisten oder benennen)
nomen
5

SQL ist nicht so sehr eine funktionale Sprache wie eine deklarative. Funktionale Sprachen legen im Allgemeinen mehr Wert auf einen deklarativen Stil als auf einen Imperativ, um Nebenwirkungen zu minimieren. Dies könnte dazu führen, dass einige Leute SQL als funktional bezeichnen, aber es ist nicht korrekt. Es ist deklarativ mit prozeduralen Elementen.

Yuriy Zubarev
quelle
1
Aber Abfragen (Select-Anweisungen) sind (rein mathematische) Funktionen und erstklassige Objekte in der Sprache. Dies macht die Sprache funktionsfähig.
Nomen
3

Ist es möglich, dass Ihre Notizen verschlüsselt sind?

Ich habe noch nie von Programmiersprachen gehört, die zwischen "beziehungsbasiert" und "hochgradig" aufgeteilt sind. Low Level / High Level wird normalerweise verwendet, um Assembler und C von Sprachen zu unterscheiden, die eine direkte Unterstützung für abstraktere Strukturen bieten. Relationen sind eine ziemlich abstrakte Struktur, daher würde ich sagen, dass alles, was Relationen unterstützt, per Definition hochrangig ist.

Pure SQL wird in der Regel als deklarative Sprache beschrieben, wobei die verschiedenen Anbieter einige prozedurale Aspekte berücksichtigen. Die Tatsache, dass SQL keine Funktionen als Variablen unterstützt, scheint mir sofort zu disqualifizieren, dass es sich um eine funktionale Sprache handelt.

Charles E. Grant
quelle
Abfragen sind reine Funktionen für Mengen / Beziehungen und erstklassige Objekte in der Sprache. Ipso facto funktionsfähig.
Nomen
1

SQL ist eine relationale, satzbasierte Sprache, deren prozedurale Funktionalität verbessert wurde.

Ich weiß nicht, ob ich SQL für funktional halte, es hat jedoch einige Aspekte von funktionalen Sprachen. Moderne Varianten von SQL (mit den prozeduralen Bits) sind definitiv nicht funktionsfähig.

Jonathan Rich
quelle
-1

Ich denke, SQL ist ein syntaktischer Zucker um relationale Algebra + etwas mehr. Die relationale Algebra verfügt über eine Vielzahl von funktionalen Sprachen und nutzt Funktionen mit sehr hoher Ausdruckskraft (Auswahl, Projektion, Umbenennung, Vereinigung, Vereinigung, Schnittmenge ...). Aber soweit ich weiß, hat die grundlegende Behandlung der relationalen Algebra normalerweise kein Äquivalent zum Lambda-Operator, obwohl sie nahtlos mit einem Rekursionsoperator erweitert werden kann.

Ich denke, Beziehungsalgebra ist eher eine algebraische Sprache. SQL ist mit seinen Unterabfragen von der reinen relationalen Algebra zu einem funktionaleren Stil übergegangen, aber ohne Lambda-Operator ist es meiner Meinung nach keine voll funktionsfähige Sprache. Ich weiß nicht, ob es nahtlos zu einer voll funktionsfähigen Sprache erweitert werden kann, ich bin kein Experte auf diesem Gebiet. Haskell verfügt über einige Bibliotheken mit dem Ziel, Datenbanksprachen auf sehr hohem Niveau bereitzustellen.

physis
quelle
-1

Ich kenne nicht alle Feinheiten, die erforderlich sind, um eine Sprache als funktional zu qualifizieren, aber Sql Server hat eine sehr interessante Methode für die Arbeit mit Funktionen eingeführt. Eine spezielle Klausel ermöglicht die Interaktion von Funktionen in einer Abfrage. Es heißt Übernehmen. Als ich das einem ehemaligen APL-Programmierer erklärte, sagte er mir, dass es in APL eine ähnliche Klausel für ein ähnliches Ziel gibt. Mit der Apply-Klausel können Sie eine Reihe von Attributen aus einer Tabellenzeile oder einer Tabellenfunktionszeile als Eingabe an eine andere Funktion übergeben. Abgesehen davon habe ich eine Einschränkung für den Typ der zu schreibenden Tabellenfunktion auferlegt, um als funktionsfähig zu gelten. Das muss als inline deklariert werden, was bedeutet, dass es als einzelne select-Anweisung ausgedrückt wird. Dies setzt voraus, dass keine Variablen vorhanden sind. Solche Abfragen mit viel Logik können geschrieben werden, sofern Sie allgemeine Tabellenausdrücke verwenden, die es dann ermöglichen, Ausdrücke in Spalten umzuwandeln, eine Art nicht veränderbarer Variable, die in anderen CTE wiederverwendet werden kann. Am Ende wird die Funktion zu einem sehr großen Makro, das es dem Optimierer frei macht, die Art und Weise zu optimieren, wie es benötigt wird. Das einzige, was den Leuten fehlt, sind einige einfache Tricks, um bedingte Logik zu schreiben und einige datenunterstützende Logik in der Abfrage zu deklarieren. Zuletzt werden einige Funktionen, die die over-Klausel verwenden, benötigt, um die Ergebnisse als Wert weiterzugeben, der in einer Reihe von anderen Reihen verwendet werden kann, aber es wäre etwas lang, dies hier zu erläutern. Das einzige, was den Leuten fehlt, sind einige einfache Tricks, um bedingte Logik zu schreiben und einige Daten als unterstützende Logik in der Abfrage zu deklarieren. Zuletzt werden einige Funktionen, die die over-Klausel verwenden, benötigt, um die Ergebnisse als Wert weiterzugeben, der in einer Reihe von anderen Reihen verwendet werden kann, aber es wäre etwas lang, dies hier zu erläutern. Das einzige, was den Leuten fehlt, sind einige einfache Tricks, um bedingte Logik zu schreiben und einige Daten als unterstützende Logik in der Abfrage zu deklarieren. Zuletzt werden einige Funktionen, die die over-Klausel verwenden, benötigt, um die Ergebnisse als Wert weiterzugeben, der in einer Reihe von anderen Reihen verwendet werden kann, aber es wäre etwas lang, dies hier zu erläutern.

Maurice Pelchat
quelle