SQL steht für Structured Query Language und wurde Ende der 70´er Jahre
bei IBM in San Jose, Kalifornien als Abfragesprache für die relationale
Datenbank DB2 entworfen. Es handelte sich hier ursprünglich um eine nichtprozedurale
Sprache, die also keine Schleifen, Unterprogramme, Funktionen und
Funktionsübergabeparameter u.s.w. enthält.
Hier ein Überblick nochmals über die Programmiersprachen der verschiedenen
Generationen:
- Generation: Maschinensprache. Diese stellt die unterste Ebene der
Programmiersprachen dar. Sie besteht nur aus Zahlen, dementsprechend sind
die Programme völlig unleserlich und schwer zu erstellen, jedoch laufen die
Programme sehr schnell ab. Hier ein Beispiel der HEX-Notation: A900
- Gereration: Assembler Sprachen. Diese orientieren sich gewöhnlich an
den Maschinenbefehlen des Prozessors: MOV AX,0 bedeutet dasselbe,
wie A900, jedoch lassen sich diese Befehle einfacher merken. Komfortable
Compiler (Übersetzer in Maschinensprache) beherrschten schon Schleifen,
Sprungmarken und Unterprogramme. Damit wurde die Lesbarkeit sehr erhöht. Wer
heutzutage Assembler z.B. unter LINUX kennen lernen möchte, der braucht
einfach nur ein kleines C-Programm mit der Option -S übersetzen.
Die GNU Assembler sowie alle GNU Compiler (C,C++, PASCAL, FORTRAN ....)
übersetzen die Befehle einer Hochsprache zuerst in eine allgemeingültige
Assemblersprache, bevor diese dann in die prozessorspezifische
Assemblersprache und dann in Maschinensprache übersetzt wird. Dies hat die
völlige Unabhängigkeit des Prozessors erst ermöglicht, wie man z.B. an LINUX
sehen kann.
- Generation: Höhere Programmiersprachen, wie z.B. BASIC, PASCAL, C.
C++, ADA, Fortran... Diese sind schon an die menschlichen Denkweisen
angepasst und ermöglichen, sofern man sich an einen Standard hält, den
Austasch des Quellcodes zwischen verschiedenen Betriebssystemen und
Prozessoren.
- Generation: Nichtprozedurale Programmiersprachen (4GL) bescheiben
nicht mehr, wie ein Problem gelöst werden soll, sondern nur noch welches
speziele Problem gelöst werden soll. Diese Programmiersprachen sind
natürlich nur für ganz spezielle Probleme konzipiert worden. Hierzu zählen
SQL, NATURAL u.s.w.
- Generation: KI Sprachen (Künstliche Intelligenz) erarbeiten
Lösungen mit Hilfe von bestimmten Regeln, die definiert wurden. Hierzu sind
ausgefeilte backtracking Mechanismen implementiert wurden, die bei der Suche
nach Problemen, falls eine Sackgasse beschritten wurde, selbstständig aus
diesen herausfinden können. Leider sind diese Sprachen noch etwas langsam.
Hierzu zählen LISP (EMACS), PROLOG und SMALLTALK.
SQL ist also in dem Sinne keine Programmiersprache und dementsprechend einfach zu erlernen. Die SQL Befehle
setzen sich aus zwei Teilen zusammen, der Data Definition Language (DDL) und
der Data Manipulation Laguage (DML). Die DDL dient dem Aufsetzen der
Datenbankstruktur, die DML dient der Manipulation der darin enthaltenen
Daten.
Relationale Datenbanken arbeiten Mengen - und Gruppenorientiert. Wer sich also
mit SQL beschäftigt, der muß sich ein wenig in Mengenlehre auskennen.
Insbesondere das Studium der INNER/OUTER/LEFT JOINS ist sehr wichtig, um
Datenmengen zu handeln. SQL Datenbanken gehören alle zu den relationalen Datenbanken. Dr. E.F. Codd
entwickelte 1970 Regeln, die eine relationale Datenbank definieren:
- Ein relationales DBMS muß in der Lage sein, Datenbanken vollständig über
seine relationalen Fähigkeiten zu verwalten.
- Darstellung von Informationen: Alle Informationen in einer relationalen
Datenbank (einschließlich Namen von Tabellen und Spalten) sind explizit
als Werte in Tabellen darzustellen.
- Zugriff auf Daten: Jeder Wert in einer relationalen Datenbank muß durch
Kombination von Tabellenname, Primärschlüssel und Spaltenname
eindeutig zu finden sein.
- Behandlung von Nullwerten: Das DBMS behandelt Nullwerte
durchgängig als unbekannte oder fehlende Daten und
unterscheidet so von Standardwerten. Zahlen können also drei Werte annehmen,
0, einen Wert und NULL für "Wert nicht vorhanden". Man spricht hier auch von
der Dreiwertigkeit.
- Struktur einer Datenbank: Die Datenbank und ihre Inhalte werden in einem
sogenannten Systemkatalog auf derselben logischen Ebene wie die
Daten selbst - also in Tabellen - beschrieben. Demzufolge läßt sich der
Katalog mit Hilfe der Datenbanksprache abfragen.
- Abfragesprache: Zu einem relationalen System gehört mindestens eine
Abfragesprache mit einem vollständigen Befehlssatz für Datendefinition,
Manipulation, Integritätsregeln, Autorisierung und Transaktionen.
- Aktualisieren von VIEWS (Sichten): Alle VIEWS, die theoretisch aktualisiert
werden können, lassen sich auch vom System aktualisieren.
- Abfragen und Bearbeiten ganzer Tabellen: Das DBMS unterstützt nicht nur
Abfragen, sondern auch die Operationen für Einfügen, Aktualisieren
und Löschen in Form ganzer Tabellen.
- Physikalische Datenunabhängigkeit: Der logische Zugriff auf die Daten
durch Anwendungen muß unabhängig von den
physikalischen Zugriffsmethoden oder den Speicherstrukturen der Daten
sein.
- Logische Datenunabhängigkeit: Änderungen der Tabellenstrukturen dürfen
keinen Einfluß auf die Logik der Anwendungen haben.
- Unabhängigkeit der Integrität: Integritätsregeln müssen sich in der
Datenbanksprache definieren lassen. Die Regeln müssen im Systemkatalog
gespeichert werden. Es darf nicht möglich sein, die Regeln zu umgehen.
- Verteilungsunabhängigkeit: Der logische Zugriff auf die Daten durch
Anwendungen darf sich beim Übergang von einer nicht verteilten zu einer verteilten Datenbank nicht
ändern.
- Kein Unterlaufen der Abfragesprache: Integritätsregeln, die über die
Datenbanksprache definiert sind, dürfen sich nicht mit Hilfe von
Low-Level Sprachen umgehen lassen.
Dr. E. F. Codd hat hier in SQL alle Elemente der Algebra integriert, um Daten mengenmäßig zu
erfassen, zu speichern, und diese in Relation zueinander zu setzen. Hierbei können Schnittmengen,
Vereinigungsmengen, Restmengen u.s.w. gebildet und ausgegeben werden. Diese
werden durch sogenannte JOINS, siehe Kapitel
JOINS,
durchgeführt.
Bei dem Aufbau von einer SQL Datenbank müssen die Daten so aufgeteilt
werden, daß sie voneinander verschiedene, eindeutige Datensätze bilden.
Dieser Prozeß wird in Kapitel
Normalisierung
beschrieben, und ist ein
unentbehrlicher Schritt vor der eigentlichen Implementierung einer Datenbank.
Hierzu werden, wie in Kapitel
Entity Relationship Diagramme (ER)
beschrieben, ER - Diagramme erstellt. Ein solches Diagramm ist
für die Entwurfsphase einer Datenbank unentbehrlich. Aus einem ER - Diagramm
wird das Relationenmodell nach E.F. Codd entwickelt, wie in Kapitel
Relationenmodell
beschrieben. Eine saubere Vorarbeit erspart später
viele Änderungen bei Datenformaten und Schnittstellen zur SQL-Datenbank.
Mit ANSI-92 SQL wurde ein gemeinsamer Standard geschaffen, an den sich
PostgreSQL (für welches alle Beipiele hier im Handbuch ebenso gelten) z.B. hält.
Leider gibt es hier verschiede Ebenen des Sprachunmfages: Entry, Intermediate
und Full. Zur Erfüllung des vollen Sprachumfanges müssen folgende Merkmale erfüllt
sein:
- Anbindung an andere Datenbanken über z.B. ODBC
- Rollbare Cursor dienen dem Scrolling über Fehler und Datensätze hinweg
- Dynamisches SQL bietet die Möglichkeit, SQL-Befehle vor der Ausführung
vorzubereiten
- Verschiedene JOIN - Formen
Im Grunde erfüllen nur wenige SQL - Datenbanken den Standard "full". Dennoch
kann man auch mit diesen hervorragend arbeiten, da es viele Umsschreibungen
gibt, wie in Kapitel
Workarounds beschrieben ist. In der Praxis hat jede
Datenbank ihre Eigenheiten, sodaß oftmals der Wechsel zwischen den
Datenbanken nicht einfach möglich ist.
Mit der Abfragesprache SQL können folgende Operationen mit den Daten
ausgeführt werden:
- Veränderung der Struktur einer Datenbank
- Zugriffsrechte auf Strukturen vergeben
- Informationen auslesen
- Inhalte verändern
Die Sprache SQL ist im Laufe der Zeit um einige Kategorien von besonderen
Funktionen erweitert worden, von denen man fast alle auch in MySQL
wiederfinden:
- Aggregatfunktionen (COUNT, SUM, AVG, MAX, MIN, VARIANCE, STDDEV...) sind im ANSI
Standard definiert und in vielen SQL Datenbanken erheblich erweitert
worden.
- Datum - und Zeitfunktionen
- Arithmetische Funktionen (ABS, SIN, COS, LN, LOG, MOD, FLOOR,
CEIL,...) sind in MySQL in einem sehr großen Umfang implementiert
- Zeichenfunktionen (TOLOWER, TOUPPER, LPAD, RPAD, REPLACE, SUBSTR,
INSTR..) sind in MySQL ebenfalls in großem Umfang implementiert
- Umwandlungsfunktionen (TO_CHAR, TO_ASCII ...)
- Andere Funktionen (GREATEST, LEAST...)
Als Klauseln (clauses) bezeichnet man bei SQL z.B.:
- WHERE
- STARTING WITH
- ORDER BY
- GROUP BY
- HAVING
Diese Klauseln sind alle Optionen des Befehls SELECT, dessen vielen
Parameter in Kapitel
SELECT beschrieben ist, und dienen dazu, Mengen zu beschränken, zu sortieren und
deren Ausgabe zu ordnen.
Das praktische an SQL ist, daß wenn man die Abfragesprache einmal erlernt hat (so schwer
ist es wirklich nicht), kann man aus riesigen Datenmengen wirklich alle
Informationen auslesen, die man braucht. Z.B. kann man Daten sortieren,
verändern, filtern, Statistiken erheben, u.s.w. Mit Hilfe von
Datenbankschnittstellen, wie z.B. ODBC und ASCII Im/Export kann man Daten
mit beliebigen Datenbanken austauschen und sogar diese mit einbinden. Die
ODBC Schnittstelle, genauer in Kapitel
ODBC - Schnittstelle
beschrieben, dient hier als Datenbank unabhängige
Schnittstelle zu Applikationen unter Windows und UNIX.