Was bedeutet SQL
SQL steht für Structured Query Language. SQL (mehr Infos SQL Training) wird zur Kommunikation (mehr dazu Kommunikation Training) mit einer Datenbank (mehr dazu Datenbank Training) verwendet. Laut ANSI (American National Standards Institute) ist es die Standardsprache für relationale Datenbankmanagementsysteme. ISO (siehe ISO Schulung) hat sich diesem Standard angeschlossen.
Heute ist die Structured Query Language das Standardmittel zur Manipulation und Abfrage von Daten in relationalen Datenbanken, allerdings mit proprietären Erweiterungen unter den Produkten. Die Einfachheit und Allgegenwart von SQL haben sogar die Entwickler vieler "NoSQL"- oder nicht-relationaler Datenspeicher wie Hadoop dazu veranlasst, Untermengen von SQL zu übernehmen oder eigene SQL-ähnliche Abfragesprachen zu entwickeln.
Aber SQL war nicht immer die "universelle" Sprache für relationale Datenbanken. Von Anfang an (ca. 1980) hatte SQL gewisse Schläge gegen sie. Viele Forscher und Entwickler zu dieser Zeit waren der Meinung, dass der Overhead von SQL verhindern würde, dass es in einer Produktionsdatenbank jemals praktisch einsetzbar wäre.
SQL-Historie
Bevor es SQL gab, verfügten Datenbanken über enge, navigationsorientierte Programmierschnittstellen und wurden in der Regel um ein Netzwerkschema herum entworfen, das CODASYL-Datenmodell genannt wurde. CODASYL (Committee on Data Systems Languages) war ein Konsortium, das für die Programmiersprache COBOL (siehe COBOL Training) (ab 1959) und Erweiterungen der Datenbanksprache (ab 10 Jahre später) verantwortlich war.
Wenn Sie eine CODASYL-Datenbank programmierten, navigierten Sie zu Datensätzen durch Sets, die Eins-zu-viele-Beziehungen ausdrücken. Ältere hierarchische Datenbanken lassen nur die Zugehörigkeit eines Datensatzes zu einer Menge zu. Netzwerkdatenbanken erlauben die Zugehörigkeit eines Datensatzes zu mehreren Sets.
Relationale Datenbanken und SQL
Warum sollten Sie auf eine Verbesserung der Ausführungsgeschwindigkeit und des Speicherverbrauchs um den Faktor zwei verzichten? Es gab zwei große Gründe: einfache Entwicklung und Portabilität. Es war eine Tatsache, dass beides 1980 im Vergleich zu den Leistungs- und Speicheranforderungen nicht viel ausmachte, aber als die Computerhardware besser und billiger wurde, kümmerten sich die Leute nicht mehr um Ausführungsgeschwindigkeit und Speicher und sorgten sich mehr um die Entwicklungskosten.
Mit anderen Worten, Moore's Law beendete CODASYL-Datenbanken zugunsten von relationalen Datenbanken. Wie sich herausstellte, war die Verbesserung der Entwicklungszeit beträchtlich, aber die SQL-Portabilität erwies sich als ein Märchen.
Woher kamen das relationale Modell und SQL? E.F. "Ted" Codd war ein Informatiker am IBM San Jose Research Laboratory, der in den 1960er Jahren die Theorie des relationalen Modells ausarbeitete und 1970 veröffentlichte. IBM implementierte nur langsam eine relationale Datenbank, um die Einnahmen ihrer CODASYL-Datenbank IMS/DB zu schützen. Als IBM schließlich sein System R (siehe auch R Schulung) Projekt startete, stand das Entwicklungsteam (Don Chamberlin und Ray Boyce) nicht unter Codd, und sie ignorierten Codd's Alpha-Relational Language Paper von 1971, um ihre eigene Sprache, SEQUEL (Structured English Query Language), zu entwerfen. 1979, noch bevor IBM sein Produkt überhaupt veröffentlicht hatte, nahm Larry Ellison die Sprache in seine Oracle-Datenbank auf (wobei er IBMs SEQUEL-Veröffentlichungen vor der Markteinführung als seine Spezifikation verwendete). SEQUEL wurde bald zu SQL, um eine internationale Markenverletzung zu vermeiden.
Eine rein relationale Datenbank, wie sie von Codd entworfen wurde, ist auf Tupeln aufgebaut, die in Beziehungen gruppiert sind, die mit der Prädikatenlogik erster Ordnung übereinstimmen. Relationale Datenbanken der realen Welt haben Tabellen, die Felder, Beschränkungen und Trigger enthalten, und Tabellen sind durch Fremdschlüssel miteinander verbunden. SQL wird verwendet, um die zurückzugebenden Daten zu deklarieren, und ein SQL-Abfrageprozessor und ein Abfrageoptimierer verwandeln die SQL-Deklaration in einen Abfrageplan, der von der Datenbank-Engine ausgeführt wird.
SQL umfasst eine Untersprache zum Definieren von Schemata, die Datendefinitionssprache (DDL), sowie eine Untersprache zum Modifizieren von Daten, die Datenmanipulationssprache (DML). Beide haben ihre Wurzeln in frühen CODASYL-Spezifikationen. Die dritte Subsprache in SQL deklariert Abfragen durch die SELECT-Anweisung und relationale Joins.
SQL SELECT-Anweisung
Die SELECT-Anweisung teilt dem Abfrageoptimierer mit, welche Daten zurückgegeben werden sollen, in welchen Tabellen gesucht werden soll, welchen Beziehungen gefolgt werden soll und welche Reihenfolge für die zurückgegebenen Daten gelten soll. Der Abfrageoptimierer muss selbst herausfinden, welche Indizes zu verwenden sind, um Brute-Force-Tabellen-Scans zu vermeiden und eine gute Abfrageleistung zu erzielen, es sei denn, die betreffende Datenbank unterstützt Indexhinweise.
Ein Teil der Kunst des relationalen Datenbankdesigns hängt von der vernünftigen Verwendung von Indizes ab. Wenn Sie einen Index für eine häufige Abfrage auslassen, kann die gesamte Datenbank unter starker Belastung beim Lesen verlangsamt werden. Wenn Sie zu viele Indizes haben, kann sich die gesamte Datenbank unter hoher Schreib- und Aktualisierungslast verlangsamen.
Eine weitere wichtige Kunst ist die Wahl eines guten, eindeutigen Primärschlüssels für jede Tabelle. Sie müssen nicht nur die Auswirkungen des Primärschlüssels auf häufige Abfragen berücksichtigen, sondern auch, wie er in Joins spielt, wenn er als Fremdschlüssel in einer anderen Tabelle erscheint, und wie er sich auf den Verweisort der Daten auswirkt.
Im fortgeschrittenen Fall von Datenbanktabellen, die je nach dem Wert des Primärschlüssels in verschiedene Volumes aufgeteilt sind, dem so genannten horizontalen Splitting, müssen Sie auch berücksichtigen, wie sich der Primärschlüssel auf das Splitting auswirkt. Tipp: Sie möchten, dass die Tabelle gleichmäßig auf die Datenträger verteilt wird, was darauf hindeutet, dass Sie keine Datumsstempel oder aufeinanderfolgende Ganzzahlen als Primärschlüssel verwenden möchten.
SQL Joins
Die Kurzversion davon ist ziemlich einfach. Jede Tabelle, die Sie in Beziehungen verwenden möchten, sollte eine Primärschlüsselbeschränkung haben; dies kann entweder ein einzelnes Feld oder eine Kombination von Feldern sein, die durch einen Ausdruck definiert sind.
Primärschlüssel sind immer indexiert und eindeutig (die Feldwerte können nicht dupliziert werden). Andere Felder können optional indiziert werden. Es ist oft nützlich, Indizes für Fremdschlüsselfelder und für Felder zu erstellen, die in WHERE- und ORDER BY-Klauseln erscheinen, wenn auch nicht immer, wegen des potentiellen Overheads durch Schreib- und Aktualisierungsvorgänge.
SQL stored procedures
Manchmal bringt Sie der deklarative Charakter der SELECT-Anweisung nicht dorthin, wo Sie hinwollen. Die meisten Datenbanken verfügen über eine Einrichtung namens Stored Procedures; leider ist dies ein Bereich, in dem fast alle Datenbanken proprietäre Erweiterungen der ANSI/ISO-SQL-Standards verwenden.
In SQL Server (mehr Infos SQL Server Seminar) war der anfängliche Dialekt für Stored Procedures (oder Stored Procs) Transact-SQL, alias T-SQL. Details finden sich in der entsprechenden T-SQL Schulung. Insbesondere wird hier auf die Befehle der Transaktionssteuerung eingegangen. Analog gibt es bei Oracle (mehr dazu Oracle Training) PL-SQL. Der an Details interessierte Programmierer sei auf PL/SQL Schulung verwiesen. Beide Datenbanken haben zusätzliche Sprachen für Stored Procedures hinzugefügt, wie z.B. C#, Java (mehr Infos Java Seminar) und R. Eine einfache T-SQL-Stored Procedure könnte nur eine parametrisierte Version einer SELECT-Anweisung sein. Ihre Vorteile sind Benutzerfreundlichkeit und Effizienz. Stored Procedures werden optimiert, wenn sie gespeichert werden, und nicht jedes Mal, wenn sie ausgeführt werden.
Eine kompliziertere T-SQL-Stored Procedure könnte mehrere SQL-Anweisungen, Ein- und Ausgabeparameter, lokale Variablen, BEGIN...END-Blöcke, IF...THEN...ELSE-Bedingungen, Cursor (zeilenweise Verarbeitung einer Menge), Ausdrücke, temporäre Tabellen und eine ganze Reihe anderer prozeduraler Syntax verwenden. Wenn die Stored-Procedure-Sprache C#, Java oder R ist, werden Sie natürlich die Funktionen und die Syntax dieser prozeduralen Sprachen verwenden. Mit anderen Worten, trotz der Tatsache, dass die Motivation für SQL die Verwendung standardisierter deklarativer Abfragen war, sieht man in der realen Welt viel datenbankspezifische prozedurale Serverprogrammierung. Ein passendes SQL Seminar findet sich unter einer Auswahl von 44 verschiedenen SQL-Kursen.
SQL auf dem Server
SQL kann verwendet werden, um die Daten in der serverseitigen Datenbank einer Anwendung zu verwalten. Ein Benutzer benutzt die Anwendung über das "Frontend" (Webseite oder mobile Anwendung), das Frontend sendet HTTP-Anfragen an das "Backend" (Server), und das Backend gibt SQL-Befehle an die Datenbank aus. Sie können eine serverseitige Anwendung auf Ihrem eigenen Computer mit vielen verschiedenen Sprachen/Frameworks einrichten, z.B. mit LAMP.
SQL im Web
Wenn Sie kein Server-Setup und keine zu analysierenden Daten haben, können Sie SQLite (mehr Infos SQLite Schulung) innerhalb einer Webseite verwenden, um Daten zu speichern, die der Benutzer während der Benutzung der Webseite erstellt. Die Daten werden jedoch nicht gespeichert, wenn der Benutzer die Seite verlässt. SQLite ist eine eingebettete SQL-Datenbank-Engine. Im Gegensatz zu den meisten anderen SQL-Datenbanken verfügt SQLite nicht über einen separaten Serverprozess. SQLite liest und schreibt direkt in gewöhnliche Plattendateien. Eine komplette SQL-Datenbank mit mehreren Tabellen, Indizes, Triggern und Views ist in einer einzigen Plattendatei enthalten. Das Datenbankdateiformat ist plattformübergreifend - Sie können eine Datenbank frei zwischen 32-Bit- und 64-Bit-Systemen oder zwischen Big-Endian- und Little-Endian-Architekturen kopieren. Diese Eigenschaften machen SQLite zu einer beliebten Wahl als Anwendungsdateiformat.
Spark SQL
Mit Spark SQL können Sie strukturierte Daten innerhalb von Spark-Programmen abfragen, indem Sie entweder SQL oder eine vertraute DataFrame-API verwenden. Verwendbar in Java, Scala (mehr dazu Scala Schulung) , Python (mehr dazu Python Seminar) und R. Spark SQL verwenden beide Spark Core als Verarbeitungsmaschine, um die Aufgabe auszuführen. Spark unterstützt die In-Memory-Verarbeitung, die in der Regel 50-100 Mal schneller ist als die normale Verarbeitung. Außerdem bietet Spark SQL eine automatische Abfrageoptimierung für eine bessere Leistung.
Heute ist die Structured Query Language das Standardmittel zur Manipulation und Abfrage von Daten in relationalen Datenbanken, allerdings mit proprietären Erweiterungen unter den Produkten. Die Einfachheit und Allgegenwart von SQL haben sogar die Entwickler vieler "NoSQL"- oder nicht-relationaler Datenspeicher wie Hadoop dazu veranlasst, Untermengen von SQL zu übernehmen oder eigene SQL-ähnliche Abfragesprachen zu entwickeln.
Aber SQL war nicht immer die "universelle" Sprache für relationale Datenbanken. Von Anfang an (ca. 1980) hatte SQL gewisse Schläge gegen sie. Viele Forscher und Entwickler zu dieser Zeit waren der Meinung, dass der Overhead von SQL verhindern würde, dass es in einer Produktionsdatenbank jemals praktisch einsetzbar wäre.
SQL-Historie
Bevor es SQL gab, verfügten Datenbanken über enge, navigationsorientierte Programmierschnittstellen und wurden in der Regel um ein Netzwerkschema herum entworfen, das CODASYL-Datenmodell genannt wurde. CODASYL (Committee on Data Systems Languages) war ein Konsortium, das für die Programmiersprache COBOL (siehe COBOL Training) (ab 1959) und Erweiterungen der Datenbanksprache (ab 10 Jahre später) verantwortlich war.
Wenn Sie eine CODASYL-Datenbank programmierten, navigierten Sie zu Datensätzen durch Sets, die Eins-zu-viele-Beziehungen ausdrücken. Ältere hierarchische Datenbanken lassen nur die Zugehörigkeit eines Datensatzes zu einer Menge zu. Netzwerkdatenbanken erlauben die Zugehörigkeit eines Datensatzes zu mehreren Sets.
Relationale Datenbanken und SQL
Warum sollten Sie auf eine Verbesserung der Ausführungsgeschwindigkeit und des Speicherverbrauchs um den Faktor zwei verzichten? Es gab zwei große Gründe: einfache Entwicklung und Portabilität. Es war eine Tatsache, dass beides 1980 im Vergleich zu den Leistungs- und Speicheranforderungen nicht viel ausmachte, aber als die Computerhardware besser und billiger wurde, kümmerten sich die Leute nicht mehr um Ausführungsgeschwindigkeit und Speicher und sorgten sich mehr um die Entwicklungskosten.
Mit anderen Worten, Moore's Law beendete CODASYL-Datenbanken zugunsten von relationalen Datenbanken. Wie sich herausstellte, war die Verbesserung der Entwicklungszeit beträchtlich, aber die SQL-Portabilität erwies sich als ein Märchen.
Woher kamen das relationale Modell und SQL? E.F. "Ted" Codd war ein Informatiker am IBM San Jose Research Laboratory, der in den 1960er Jahren die Theorie des relationalen Modells ausarbeitete und 1970 veröffentlichte. IBM implementierte nur langsam eine relationale Datenbank, um die Einnahmen ihrer CODASYL-Datenbank IMS/DB zu schützen. Als IBM schließlich sein System R (siehe auch R Schulung) Projekt startete, stand das Entwicklungsteam (Don Chamberlin und Ray Boyce) nicht unter Codd, und sie ignorierten Codd's Alpha-Relational Language Paper von 1971, um ihre eigene Sprache, SEQUEL (Structured English Query Language), zu entwerfen. 1979, noch bevor IBM sein Produkt überhaupt veröffentlicht hatte, nahm Larry Ellison die Sprache in seine Oracle-Datenbank auf (wobei er IBMs SEQUEL-Veröffentlichungen vor der Markteinführung als seine Spezifikation verwendete). SEQUEL wurde bald zu SQL, um eine internationale Markenverletzung zu vermeiden.
Eine rein relationale Datenbank, wie sie von Codd entworfen wurde, ist auf Tupeln aufgebaut, die in Beziehungen gruppiert sind, die mit der Prädikatenlogik erster Ordnung übereinstimmen. Relationale Datenbanken der realen Welt haben Tabellen, die Felder, Beschränkungen und Trigger enthalten, und Tabellen sind durch Fremdschlüssel miteinander verbunden. SQL wird verwendet, um die zurückzugebenden Daten zu deklarieren, und ein SQL-Abfrageprozessor und ein Abfrageoptimierer verwandeln die SQL-Deklaration in einen Abfrageplan, der von der Datenbank-Engine ausgeführt wird.
SQL umfasst eine Untersprache zum Definieren von Schemata, die Datendefinitionssprache (DDL), sowie eine Untersprache zum Modifizieren von Daten, die Datenmanipulationssprache (DML). Beide haben ihre Wurzeln in frühen CODASYL-Spezifikationen. Die dritte Subsprache in SQL deklariert Abfragen durch die SELECT-Anweisung und relationale Joins.
SQL SELECT-Anweisung
Die SELECT-Anweisung teilt dem Abfrageoptimierer mit, welche Daten zurückgegeben werden sollen, in welchen Tabellen gesucht werden soll, welchen Beziehungen gefolgt werden soll und welche Reihenfolge für die zurückgegebenen Daten gelten soll. Der Abfrageoptimierer muss selbst herausfinden, welche Indizes zu verwenden sind, um Brute-Force-Tabellen-Scans zu vermeiden und eine gute Abfrageleistung zu erzielen, es sei denn, die betreffende Datenbank unterstützt Indexhinweise.
Ein Teil der Kunst des relationalen Datenbankdesigns hängt von der vernünftigen Verwendung von Indizes ab. Wenn Sie einen Index für eine häufige Abfrage auslassen, kann die gesamte Datenbank unter starker Belastung beim Lesen verlangsamt werden. Wenn Sie zu viele Indizes haben, kann sich die gesamte Datenbank unter hoher Schreib- und Aktualisierungslast verlangsamen.
Eine weitere wichtige Kunst ist die Wahl eines guten, eindeutigen Primärschlüssels für jede Tabelle. Sie müssen nicht nur die Auswirkungen des Primärschlüssels auf häufige Abfragen berücksichtigen, sondern auch, wie er in Joins spielt, wenn er als Fremdschlüssel in einer anderen Tabelle erscheint, und wie er sich auf den Verweisort der Daten auswirkt.
Im fortgeschrittenen Fall von Datenbanktabellen, die je nach dem Wert des Primärschlüssels in verschiedene Volumes aufgeteilt sind, dem so genannten horizontalen Splitting, müssen Sie auch berücksichtigen, wie sich der Primärschlüssel auf das Splitting auswirkt. Tipp: Sie möchten, dass die Tabelle gleichmäßig auf die Datenträger verteilt wird, was darauf hindeutet, dass Sie keine Datumsstempel oder aufeinanderfolgende Ganzzahlen als Primärschlüssel verwenden möchten.
SQL Joins
Die Kurzversion davon ist ziemlich einfach. Jede Tabelle, die Sie in Beziehungen verwenden möchten, sollte eine Primärschlüsselbeschränkung haben; dies kann entweder ein einzelnes Feld oder eine Kombination von Feldern sein, die durch einen Ausdruck definiert sind.
Primärschlüssel sind immer indexiert und eindeutig (die Feldwerte können nicht dupliziert werden). Andere Felder können optional indiziert werden. Es ist oft nützlich, Indizes für Fremdschlüsselfelder und für Felder zu erstellen, die in WHERE- und ORDER BY-Klauseln erscheinen, wenn auch nicht immer, wegen des potentiellen Overheads durch Schreib- und Aktualisierungsvorgänge.
SQL stored procedures
Manchmal bringt Sie der deklarative Charakter der SELECT-Anweisung nicht dorthin, wo Sie hinwollen. Die meisten Datenbanken verfügen über eine Einrichtung namens Stored Procedures; leider ist dies ein Bereich, in dem fast alle Datenbanken proprietäre Erweiterungen der ANSI/ISO-SQL-Standards verwenden.
In SQL Server (mehr Infos SQL Server Seminar) war der anfängliche Dialekt für Stored Procedures (oder Stored Procs) Transact-SQL, alias T-SQL. Details finden sich in der entsprechenden T-SQL Schulung. Insbesondere wird hier auf die Befehle der Transaktionssteuerung eingegangen. Analog gibt es bei Oracle (mehr dazu Oracle Training) PL-SQL. Der an Details interessierte Programmierer sei auf PL/SQL Schulung verwiesen. Beide Datenbanken haben zusätzliche Sprachen für Stored Procedures hinzugefügt, wie z.B. C#, Java (mehr Infos Java Seminar) und R. Eine einfache T-SQL-Stored Procedure könnte nur eine parametrisierte Version einer SELECT-Anweisung sein. Ihre Vorteile sind Benutzerfreundlichkeit und Effizienz. Stored Procedures werden optimiert, wenn sie gespeichert werden, und nicht jedes Mal, wenn sie ausgeführt werden.
Eine kompliziertere T-SQL-Stored Procedure könnte mehrere SQL-Anweisungen, Ein- und Ausgabeparameter, lokale Variablen, BEGIN...END-Blöcke, IF...THEN...ELSE-Bedingungen, Cursor (zeilenweise Verarbeitung einer Menge), Ausdrücke, temporäre Tabellen und eine ganze Reihe anderer prozeduraler Syntax verwenden. Wenn die Stored-Procedure-Sprache C#, Java oder R ist, werden Sie natürlich die Funktionen und die Syntax dieser prozeduralen Sprachen verwenden. Mit anderen Worten, trotz der Tatsache, dass die Motivation für SQL die Verwendung standardisierter deklarativer Abfragen war, sieht man in der realen Welt viel datenbankspezifische prozedurale Serverprogrammierung. Ein passendes SQL Seminar findet sich unter einer Auswahl von 44 verschiedenen SQL-Kursen.
SQL auf dem Server
SQL kann verwendet werden, um die Daten in der serverseitigen Datenbank einer Anwendung zu verwalten. Ein Benutzer benutzt die Anwendung über das "Frontend" (Webseite oder mobile Anwendung), das Frontend sendet HTTP-Anfragen an das "Backend" (Server), und das Backend gibt SQL-Befehle an die Datenbank aus. Sie können eine serverseitige Anwendung auf Ihrem eigenen Computer mit vielen verschiedenen Sprachen/Frameworks einrichten, z.B. mit LAMP.
SQL im Web
Wenn Sie kein Server-Setup und keine zu analysierenden Daten haben, können Sie SQLite (mehr Infos SQLite Schulung) innerhalb einer Webseite verwenden, um Daten zu speichern, die der Benutzer während der Benutzung der Webseite erstellt. Die Daten werden jedoch nicht gespeichert, wenn der Benutzer die Seite verlässt. SQLite ist eine eingebettete SQL-Datenbank-Engine. Im Gegensatz zu den meisten anderen SQL-Datenbanken verfügt SQLite nicht über einen separaten Serverprozess. SQLite liest und schreibt direkt in gewöhnliche Plattendateien. Eine komplette SQL-Datenbank mit mehreren Tabellen, Indizes, Triggern und Views ist in einer einzigen Plattendatei enthalten. Das Datenbankdateiformat ist plattformübergreifend - Sie können eine Datenbank frei zwischen 32-Bit- und 64-Bit-Systemen oder zwischen Big-Endian- und Little-Endian-Architekturen kopieren. Diese Eigenschaften machen SQLite zu einer beliebten Wahl als Anwendungsdateiformat.
Spark SQL
Mit Spark SQL können Sie strukturierte Daten innerhalb von Spark-Programmen abfragen, indem Sie entweder SQL oder eine vertraute DataFrame-API verwenden. Verwendbar in Java, Scala (mehr dazu Scala Schulung) , Python (mehr dazu Python Seminar) und R. Spark SQL verwenden beide Spark Core als Verarbeitungsmaschine, um die Aufgabe auszuführen. Spark unterstützt die In-Memory-Verarbeitung, die in der Regel 50-100 Mal schneller ist als die normale Verarbeitung. Außerdem bietet Spark SQL eine automatische Abfrageoptimierung für eine bessere Leistung.