SQL - die Standard-Abfragesprache für Datenbanken 1. Die Geschichte von SQL 2. Die Struktur von SQL SQL enthält alle Sprachelemente, um sämtliche Arbeiten durchzuführen, die beim Umgang mit einer relationalen Datenbank anfallen, es können Anweisungen auf externer, konzeptioneller und interner Ebene ausgeführt werden. SQL ist relational vollständig, d. h. der Sprachumfang ist äquivalent zu dem der Rela tionenalgebra. Alle bekannteren Systeme wie ORACLE, INFORMIX, aber auch SYBASE, INGRES, usw. bieten wie bereits erwähnt den Sprachumfang gemäß dem ANSI-Standard, allerdings nur bis zum SQL-92 EntryLevel. SQL unterscheidet im Kern drei große Befehlsgruppen: Data Definition Language Damit werden Anweisungen zur Datendefinition bezeichnet. Gemeint ist damit die Erzeugung und die Festlegung der Struktur von Datenbankobjekten in einem Datenbankschema, ohne dass bereits Daten gespeichert werden. Die mit diesen Anweisungen beschriebenen Strukturen werden im Data Dictionary (Datenlexikon) des DBS festgehalten. Objekte, die erzeugt und definiert werden können, sind z. B. Benutzer, Tabellen, Sichten, usw. Diese Gruppe von Anweisung dient zur Manipulation von Daten. Der Name ist jedoch ein wenig irreführend, denn es gibt in SQL vier Operationen, die man zur Datenmanipulationssprache zählt: Data Manipulation Language INSERT (Einfügen von Daten in die DB), UPDATE (Ändern vorhandener Daten) und DELETE (Löschen gespeicherter Informationen). Diese drei Operationen werden auch zur Klasse der UpdateOperationen zusammengefasst. Eine Sonderstellung nimmt die vierte Anweisung SELECT ein, da sie die Daten nicht im eigentlichen Sinn manipuliert, sondern Auswertungen nahezu beliebiger Komplexität ermöglicht. Hierunter fasst man im weiteren Sinne die Gruppe der Kontrollanweisungen, die in drei Bereiche zerfällt: Transaktionen: für Zwecke des Recovery und der Behandlung konkurrierender Zugriffe werden Funktionen zur Transaktionsverarbeitung angeboten. Data Control Language Sicherheit: diese wird zum einen mit dem Vie w-Konzept gewährleistet, zum anderen stehen aber auch Anweisungen zur Verfügung, mit denen die Vergabe von Zugriffsrechten bzw. Privilegien an Benutzer oder auf Objekten gezielt gesteuert werden kann. Integrität: der Begriff Integrität bezieht sich auf die Korrektheit und Vollständigkeit der Daten. Zu dieser Gruppe zählt man auch die Sprachelemente, mit de nen sich Integritätsbedingungen formulieren lassen. Die Möglichkeiten des Standards SQL-92 sind im Full-Level weitaus größer (z. B. zentrale DB-weite so genannte allgemeine Zusicherungen (assertions)) als dies in kommerziellen Systemen der Fall ist. Jedes System stellt aber auch eigene Erweiterungen zur Verfügung, die bei anderen Datenbanksystemen nicht vorhanden sind. Bei der Verwendung nicht alltäglicher Anweisungen ist also in jedem Fall ein Blick in das Handbuch erforderlich. Diese Erweiterungen sind oft architekturbedingt: z. B. lassen sich mit der Anweisung CREATE TABLESPACE die Struktur und Größe der Datenbank beeinflussen. Diese Anweisung ordnet sich aber sowohl vom syntaktischen Aufbau als auch von ihrer Funktionalität her (es wird ein DB-Objekt erzeugt) in die Systematik der anderen DDL Anweisungen ein, so dass wir Erweiterungen dieser Art auch in den passenden Abschnitten behandeln. Andere Funktionalitäten werden je nach Hersteller als eigene Dienstprogramme zur Verfügung gestellt oder aber dem SQL-Sprachschatz hinzugefügt. So werden bei ORACLE Daten aus dem UNIX-Filesystem mit eigenen Tools in die DB geladen oder aus ihr entladen (SQLLOADER, EXPORT, IMPORT), bei INFORMIX hingegen existieren neben dem Tool DBEXPORT auch die beiden im SQL-Interpreter verwendbaren Anweisungen LTNLOAD bzw. LOAD. Auf derartige Spezialitäten kön-nen wir nicht eingehen. Im folgenden werden die obigen Befehlsgruppen noch ein wenig detaillierter aufgelöst. Bestimmte Erweiterungen oder Anweisungen für spezielle Anwendungen, die nicht in das Dreierschema passen, erhalten einen eigenen Abschnitt. Zuvor ist jedoch eine Erläuterung der Begriffe, die bei der Arbeit mit SQL-Anweisungen auftreten, sinnvoll. (Datenbanken und SQL – Rechenzentrum Niedersachsen. 79f) 3. Wichtige Befehle und Zusammenhänge SQL (Abk. für engl. structured query language): Weit verbreitete Sprache zur Definition und Manipulation rela tionaler Datenbanken. SQL wurde in den 1970er-Jahren unter dem Namen SEQUEL von der Firma IBM entwickelt. Eine Prototyp-Implementierung gelang etwa 1975. Anfang der 1980erJahre wurde SEQUEL dann zu SQL weiterentwickelt und ist heute als herstellerunabhängiger Standard weitgehend akzeptiert. Aus SQL-Sicht ist eine Relation eine mit einem Bezeichner versehene 2-dimensionale Tabelle mit folgenden Eigenschaften: - Jede Spalte (Attribut) besitzt einen eindeutigen Bezeichner (Attribut-name) und einen Wertebereich. - Alle Eintragungen in die Tabelle sind atomar, d. h., die Wertebereiche sind elementar (z. B. t integer, boolean) und nicht weiter zerlegbar. - Die Reihenfolge der Spalten ist irrelevant (R ist eine Menge). - Alle Zeilen (Tupel) sind paarweise verschieden. Eine relationale Datenbank ist dann eine Kollektion von (unterschiedlich benannten) Relationen. Beispiel: Definiert wird eine Datenbank über Tennisspieler, Turniere und Spielpläne (Abb. 1). Hier kommen zwar gleiche Attributnamen vor, dies widerspricht jedoch nicht der obigen Regel, da sie zu unterschiedlichen Relationen gehören. Ist eine Unterscheidung zwischen gleichen Attributnamen unterschiedlicher Relationen notwendig, so fügt man in SQL den Relationennamen durch einen Punkt getrennt hinzu, wie z. B. Spieler.Name und Turnier.Name zeigen. Die Sprache SQL stellt für die Manipulation von relationalen Datenbanken Sprachelemente unter anderem für folgende Operationen zur Verfügung: - Definieren von Relationenschemata durch Angabe von Relationen, Attributnamen und Wertebereichen der Attribute (CREATE TABLE ...), - Einfügen von Tupeln in eine Rela tion (INSERT INTO...j, - Löschen von Tupeln (DELETE FROM ... WHERE ...), - Änderung von Attributwerten (update), - Suchanfragen (queries). Beispiel: Löschen aller Einträge des Spielers Becker aus der Spieler-Relation: DELETE FROM Spieler WHERE Name='Becker' Suchanfragen (querie.s): Die einfachste Form lautet: SELECT (Ausdruck>,... FROM (Relationenname>,... WHERE (Bedingung> Ein Ausdruck ist hie rbei zunächst entweder ein einzelner Attributname, ein arithmetischer Ausdruck über Attributnamen, Konstanten und Grundfunktionen wie +, -, *, / usw. oder das Zeichen *. Mithilfe des Sterns werden alle Attribute der Tupel angezeigt, die die Bedingung erfüllen. Beispiele: 1. Gesucht: Die Nationalitäten aller Spieler SELECT Nat FROM Spieler Hier gibt das SQL-System die Nationalitäten aller Spieler aus, wobei Nationalitäten, denen mehrere Spieler angehören, auch mehrmals ausgegeben werden (z. B. USA). In die sen Fällen verwendet man besser die Anfrage SELECT Dmit der SQL angewiesen wird, nur die überhaupt vorkommenden verschiedenen Nationalitäten auszugeben. 2. Gesucht: Alle Informationen über die Spieler: SELECT' FROM Spieler Auswahl von Tupeln mit Bedingungen: Mittels der WHERE-Klausel kann man Tupel auswählen, die bestimmte Bedingungen erfüllen. Beispiel: Gesucht: Alle Spieler aus Schweden und den USA: SELECT Name,Nat FROM Spieler WHERE Nat='USA' OR Nat='S' Verknüpfung von Relationen (Kreuzprodukt): Häufig müssen bei einer Suchanfrage die Daten mehrerer Rela tionen miteinander gekoppelt werden. Beispiel: Gesucht: Zeiten, zu denen Mayotte spielt: SELECT Turnier FROM Spielplan WHERE Name='Mayotte' Die Ausgabe Wimbledon verwendet man nun als Parameter einer zweiten Anfrage: SELECT Zeit FROM Turnier WHERE Name='Wimbledon' Ausgabe: Juni. Besser löst man dieses Problem durch Koppelung der beiden Relationen Spieler und Turnier: SELECT Zeit FROM Turnier, Spielplan WHERE Spielplan.Name= 'Mayotte' AND Spielplan.Turnier= Turnier.Name Hier sind zur Unterscheidung der beiden Attribute Name und Turnier in den Relationen Spielplan und Turnier die vollen Namen mit Punktnotation zu verwenden. Teilanfragen (engl. subqueries): Als Bedingung innerhalb der WHERE-Klausel einer SELECT-Anfrage sind Bezüge auf die Ergebnisse weiterer untergeordneter SELECT-Anfragen möglich. Die Ergebnisse der Teilanfragen werden dann als implizite Relationen aufgefasst, die mit anderen Relationen verknüpft werden können oder an die weitere Anfragen gerichtet werden können. Auf diese Weise lassen sich relativ komplizierte Anfragen mit Querbezügen formulieren. Beispiele: 1. Gesucht: Alle Spieler, die in Wimbledon spielen, und deren Nationalitäten: SELECT Name,Nat FROM Spieler WHERE Name IN (SELECT Name FROM Spielplan WHERE Turnier= 'Wimbledon') Hier symbolisiert der IN-Operator das Elementsymbol E auf Mengen. Die Teilanfrage in Klammern liefert also eine Menge von Namen, die als Parameter in die Hauptanfrage ein gehen. 2. Gesucht: Namen der Spieler, die die meisten Punkte besitzen: SELECT Name,Punkte FROM Spieler WHERE Punkte >= ALL (SELECT Punkte FROM Spieler) Der Operator ALL symbolisiert den ∀ Quantor ("Für alle"-Quantor). Die WHERE-Bedingung ist also erfüllt, wenn die Punktzahl des gesuchten Spielers größer oder gleich aller Punktezahlen ist, die die Teilanfrage liefert. (Duden der Informatik. 484 ff)