6.2. Standard-SQL history menue Letztmalig dran rumgefummelt: 09.01.19 07:23:54

SQL - Structured Querry Language ist die am häufigsten angewandte Systemabfragesprache für Datenbestände (SQL - "intergalactic data speak"), die - von IBM entwickelt - für eine Reihe von Applikationen zur Verfügung gestellt wird, welche mit Datenbeständen relationaler Art in Verbindung gebracht werden können. Dabei kann durch Verknüpfungen in mehreren Dateien nach bestimmten Kriterien gesucht bzw. diese herausgefiltert werden. Ihr großer Vorteil ist die sehr stark an die natürliche Sprache Englisch angenäherte Form der Kommandos für alle typischen Aufgaben der Arbeit mit Datenbanken wie:

  • Abfragen (finden von Daten, welche bestimmte Kriterien erfüllen)
  • Ändern
  • Löschen
  • Aufstellung beliebiger Listen (Auswertung, Berichterstattung)
  • Datensicherung
  • Datenschutz (physischer).
  0. SQL - Vorbemerkungen
 
1. SQL - die Standarddatenbanksprache - historischer Abriss
 
2. Basiskonstrukte
 
3. Identifer, Operatoren und Funktionen
  4. Basiskonstrukte
  5. SUBSELECTS
 
6. Statements für Metadaten
 
7. Logische Prädikate
  8. Subqueries
  9. HAVING-Klausel
10. GROUP BY
Quick-Index:

Datenbanken

Logo für die Standard-System-Query-Language

inhaltlich auf korrektem Stand - evtl. partiell unvollständig ;-)

Wissen für Fortgeschrittene der Informatik

Quellen:

Das speziell von Microsoft für seine Produkte entwickelte Paket heißt "Microsoft Query" und kennt zumindest die Standards von SQL, welche es noch erweitert.
Die SQL stellt eine Schnittstelle eines modernen DBMS dar. Hierbei handelt es sich um eine formalisierte, produktunabhängige relationale Datenbanksprache. SQL ist eine mengenorientierte Sprache und basiert damit auf den theoretischen Grundlagen der Relationsalgebra.
SQL arbeitet mit verschiedenen Objekten (wie zum Beispiel Tabellen oder Views, Spalten oder Reihen) und Operationen auf diesen Objekten. Ferner verwaltet SQL Privilegien, die festlegen, wer welche Operationen an welchen Objekten ausführen darf.
Der Befehlssatz der Sprache SQL lässt sich in drei Hauptkomponenten unterteilen:

  • DDL - Sprache für die Definition von Objekten (Data Definition Language) Mit Hilfe der DDL werden die Tabellen-, View- und Indexdefinitionen durchgeführt.
  • DML - Sprache für die Manipulation von Objekten (Data Manipulation Language) Bei der DML geht es um das Suchen, Einfügen, Aktualisieren und Löschen von Zeilen einer oder mehrerer Tabellen oder Views.
  • DCL - Sprache für die Kontrolle der Privilegien (Data Control Language) Mit Hilfe der DCL werden Transaktionen und Regel bei Mehrfachzugriff auf das selbe Objekt, die Zugriffsrechte und Einschränkungen zum Erhalt der Korrektheit von Daten festgelegt.

Neben diesen Komponenten gehören zum SQL Instrumente zur Systemverwaltung und zur Beschleunigung der Befehlsbearbeitung "Performanz-Optimierung” (nur für Datenbank-Administrator). Die Datenbanksprache SQL gewinnt zur Zeit wachsende Bedeutung. Als Ursachen hierfür sind folgende Tatsachen zu sehen:

  • Die Sprache verfügt über einen äußerst einfachen, der natürlichen Sprache angepassten Befehlsatz und erlaubt das Arbeiten mit Datenbanken ohne tiefergehende Kenntnisse über die interne Struktur und die Organisationsprinzipien der konkreten Datenbank vorauszusetzen (Programmiersprache der vierten Generation)
  • SQL wurde ursprünglich für den Einsatz auf Großrechnern konzipiert (z. B. Großrechner-Datenbanksystem DB2 von IBM - 1985 standardisiert als ANSI/SQL durch ANSI (American National Standard Institut). Aufgrund der immer engeren Vernetzung von Großrechnersystemen mit Personalcomputern nimmt die Bedeutung von Werkzeugen zum Zugriff auf verteilte Datenbanken stark zu. Da die im Bereich der Personalcomputer dominierende Datenbanksysteme in der Regel nicht direkt auf Großrechnerdatenbanken zugreifen können, ist zu beobachten, dass die wichtigsten Datenbanksysteme für PC's in ihre neusten Versionen SQL-Implementationen einbinden.


0. Allgemeine SQL-Statemaents history menue scroll up

Personenbezogene Daten sind Einzelangaben über persönliche oder sachliche Verhältnisse einer bestimmten oder bestimmbaren natürlichen Person (Betroffener). Mit der Verfügbarkeit gewinnt man extrem viel Einfluss über eine Person - entsprechnd groß ist ihre Schutzbedürftigkeit. Dies zu erkennen hat übrigens eine ganze Weile gedauert und ist in ihrer Tragweite auch heute noch nicht jedem bewusst.

Grundlage der relationalen Datenbanken-SQL ist die Tabelle mit ihren x-y (Zeilen-, Spaltenbeziehungen) - Allgemeine SQL-Statements

Statement Funktion
SELECT ausgabefelder Projektion (DISTINCT schließt Ergebnisdoppel aus)
FROM datenbankdatei Join
WHERE searchconditions; Selektion
GROUP BY fasst Attribute mit gleichen Merkmalen zusammen
HAVING wenn wahr, bleiben die Tupel erhalten
ORDER BY Sortieren (ASC - aufsteigend, DESC - absteigend)
Kreuzprodukt oder karthesisches Produkt
  • die willkürliche Verknüpfung von Tabellen mit typkompatiblen Merkmalswerten verschiedener Relationen (Kartesisches Produkt)
  • dabei ist das Ergebnis eine Liste aller Objekte die in allen Merkmalswerten der betrachteten Relationen deckungsgleich sind

SELECT DISTINCT ausgabefelder,(mathematische ausdrücke, bezeichner]
FROM tabelle1,tabelle2,..
WHERE bedingungen
GROUP BY attributliste
HAVING bedingungen
ORDER BY attributliste
ASC|DESC;

Grafische Darstellung der Selektion aus einem Datenbestand

Grafische Darstellung der Projektion aus einem Datenbestand

Grafische Darstellung des Joins aus mehreren verknüpften Datenbeständen


1. SQL - Die Standarddatenbanksprache - historischer Abriss history menue scroll up

Daten (lateinisch Data) - ursprünglich geschichtliche Zeitangaben; heute allgemeine Bezeichnung für die Zahlenwerte der Merkmalsgrößen von physikalisch- technischen Objekten (Kenn-Daten), Ereignissen, Prozessen und Abläufen (z. B. Betriebs-Daten bei techn. Vorgängen und Geräten, Bahn-Daten der Bewegungen von Raumflugkörpern). In der Datenverarbeitung versteht man unter Daten anfallende Informationen, die sich in einer maschinell verarbeitbaren Form darstellen lassen.

Verschiedene DBMS realisieren bereits Funktionen erwarteter späterer SQL-Standards, d. h. solcher nach SQL89. Andererseits fehlen auch in einigen namhaften DBMS noch Funktionen, die von SQL89 vorgeschrieben sind.
Entsprechend den aktuellen Erfordernissen der Praxis gibt es SQL in folgenden Formen:
  • InteractiveSQL (ISQL),
  • BatchSQL (BSQL),
  • Embedded SQL (ESQL).

Hier wird SQL in der interaktiven Form behandelt. Dabei werden die Statements im Dialog zwischen Anwender (in der Regel ein Endbenutzer bzw. ein Anwendungsprogrammierer) und Rechner eingegeben und ausgeführt. BatchSQL gestattet es, Folgen von SQL-Statements und Steuerstatements zu einem Batch-File zusammenzufassen, zu speichern und im Bedarfsfalle zur erneuten Ausführung, durchaus auch nach Modifikation, aufzurufen, geändert zu speichern usw. Diese Möglichkeiten sind heute in der Regel nur in älteren Versionen von Datenbankbetriebssystemen mit eigener Datenbanksprache vorhanden (MIMER mit der Sprache QL; INGRES mit der Sprache QUEL). Dafür gibt es die vom Standard geforderte Modulsprache, die jedoch kaum implementiert ist und andererseits auch die Brücke zu ESQL schlägt. ESEL, das die Einbettung von SQL-Statements in Programme, die in einer Wirtssprache geschrieben sind, gestattet. Dort wird auch die spezielle Form des Dynamic-SQL (Dyn SQL) behandelt. Geschlossene Systeme als sogenannte Sprachen der vierten Generation (4GL) werden schließlich gesondert dargestellt.
Die Statements werden weitgehend in der Reihenfolge beschrieben, wie sie beim Aufbau und der Arbeit mit der Datenbasis angewendet werden. Die syntaktische Beschreibung erfolgt mittels Syntaxgraphen. Jedes Statement wird in der Regel wie folgt dargestellt:

Name des Statements, Bedeutung, Syntax, Beschreibung, Beschränkungen, Hinweise, Beispiele.

Historische Entwicklung und gegenwärtiger Stand des Standards

Eine sehr gute Darstellung der historischen Entwicklung und weiterer Vorhaben der Standardisierung von SQL findet man in einem Buch von Date [7]1 und in einem Beitrag von Shaw [24], der ein führendes Mitglied der Standardisierungsgruppe der ANSI ist. Auch in [8] ist ein interessanter Abriss der Entwicklung enthalten. Grundsätzlich kann festgestellt werden, dass die optimistischen Termine aus den Jahren 1989/1990 für die folgenden Jahre nicht durchweg eingehalten werden konnten, was in der Schwierigkeit der Problematik zu suchen ist. U. a. sind folgende Fragen zu beantworten: Was ist von dem theoretisch Fundierten für die Praxis allgemein relevant? Was lässt sich von den aktuellen Forderungen heute effektiv oder überhaupt implementieren? Und alle Fragen müssen bei unterschiedlicher Interessenlage konkurrierender Entwicklerfirmen einheitlich beantwortet werden!
Interessant sind die Angaben aus [8], wo die 1989 vergleichbaren DBMS

  • DB2 (IBM) Rel. 3,
  • INFORMIX V 2.10,
  • INGRES V 5.0,
  • ORACLE V 5.1,
  • SQL/DS Rel. 3,
  • SYBASE V 3.4

gegenübergestellt werden. Erstaunlich ist, dass zur damaligen Zeit wichtige Forderungen des Standards bezüglich der Integritätssicherung nicht erfüllt wurden. Hier ein kurzer Überblick:

CREATE TABLE: Spalte NOT NULL bei allen genannten DBMS möglich; INDEX UNIQUE mit Ausnahme von INGRES möglich

Damit war die Möglichkeit gegeben, einen Primärschlüssel wenigstens indirekt nutzergesteuert zu erzeugen. Bei keinem der genannten DBMS war es jedoch möglich, eine Spalte als PRIMARY KEY bzw. FOREIGN KEY2 direkt zu definieren. (Das DBMS MIMER in der Version 5.1 erfüllte dagegen diese Funktionen bereits 1988!) Den UNION-Operator (sowie auch die Operatoren INTERSECT und MINUS) zur Verbindung von mehreren Select-Abfragen in einem einzigen Statement gab es nur bei ORACLE.
Das American National Standard Institute (ANSI) bildete Ende der 70er Jahre eine Gruppe zur Entwicklung eines Standards für relationale Datenbanksprachen. Am Anfang standen Untersuchungen der bis dahin voneinander isoliert entwickelten und implementierten Sprachen von DBMS mit dem Ziel, gemeinsame Funktionen zu erkennen, die sich einer Vereinheitlichung besonders anboten. Die Arbeit verlief zunächst analytisch, wurde aber bald zunehmend von theoretischen Vorstellungen getragen.
1981 begann die Entwicklung des Standards auf der Grundlage einer Datenbanksprache, die durch die Fa. IBM im System/R bereits implementiert worden war.
Seit 1982 wurden die Standardisierungsbestrebungen durch die International Standards Organization (ISO) (Westeuropa) und verschiedene nationale Standardisierungsorganisationen, die mit der ISO assoziiert waren, übernommen.
Es entstand die ISO-Gruppe für Database Languages, um den ANSI-Standard zu analysieren und als Grundlage für die Entwicklung eines ISO-Standards zu nutzen.
ISO und ANSI veröffentlichten 1986 gemeinsam den ersten Standard für SQL, heute im allgemeinen SQL86 [2] und [13] genannt.
Im Standard SQL86 wurden grundlegende Sprachkonstrukte zur Datendefinition und -manipulation definiert. Aufgrund der bis dahin sehr differenzierten Datenbanksprachen umfasste dieser Standard nur die wichtigsten Funktionen, zu denen einheitliche Auffassung zu erzielen war.

1989 wurde eine Weiterentwicklung des SQL86-Standards unter dem Namen SQL89 veröffentlicht, die als wichtigste Erweiterung umfassendere Daten- und Referenzintegritätsdeklarationen beinhaltete. Die danach noch vorhandenen Unzulänglichkeiten sollen mit SQL2 und SQL3 beseitigt werden. 1990 wurde erwartet, dass der Standard SQL2 im Jahre 1992 publiziert werden könnte. Der Standard SQL3 sollte nicht vor 1995 veröffentlichungsreif sein. Heute ( Stand 1994) können diese Termine kaum als erfüllbar angesehen werden
Der SQL2-Standard ist heute, auch nur teilweise, bei wenigen DBMS implementiert. Vorabausgaben von SQL2 sind unter den Bezeichnungen Entry SQL2 und IntermediateSQL2 bekannt geworden. Der volle Standard heißt z. Z. Full SQL2.
Interessant sind die benötigten Druckseiten der Standards bzw. deren Entwürfe: SQL86 umfasst etwa 100 Seiten, SQL89 etwa 115 Seiten; für SQL2 und SQL3 mehr als 700 Seiten. Diese Explosion, die nicht nur auf den Seitenumfang bezogen ist, dürfte Anlass dafür sein, über das Machbare, Implementierbare und vom Nutzer Anwendbare nachzudenken. Durch die Parallelentwicklung des Sprachstandards durch ANSI (USA) und ISO (Europa) ergeben sich geringfügige Unterschiede, die jedoch nicht grundsätzlicher Natur und für die praktische Arbeit ohne Bedeutung sind. Im übrigen sind die meisten heute kommerziell vertriebenen DBMS Entwicklungen aus den USA, für die der ANSI-Standard Grundlage ist. Zusammenfassend können die Erweiterungen und geplanten Erweiterungen wie folgt zusammengefasst werden:
  1. Der Standard SQL86 formulierte die grundsätzlichen Forderungen an die Datendefinition und Datenmanipulation
  2. Der Standard SQL89 forderte als wesentliche Funktionen die Unterstützung der Integrität:

Sicherheit/Zugriffsschutz

  • GRANT-Statements View-Einrichtung

Integrität

  • NOT NULL PRIMARY KEY
  • CHECK FOREIGN KEY
  • UNQUE REFERENCE

Recovery/Concurrency Transaktionen-Management

  • COMMIT WORK ROLLBACK WORK
  1. In späteren Standards (z. B. SQL2) wird erwartet, dass folgende Eigenschaften und Funktionen festgeschrieben werden:

Wirtssprachen für ESQL und die Modulsprache

COBOL, FORTRAN, PASCAL, PL/1 und neu: ADA und C

Domains

CREATE / DROP DOMAIN

Datentypen

  • VARCHAR
  • NCHAR (nationale Zeichenketten)
  • DATETIME
  • INTERVALL

Schemadefinition

  • DROP SCHEMA
  • DROP TABLE
  • DROP VIEW
  • REVOKE
  • ALTER TABLE
  • CREATE / DROP ASSERTION (Setzen / Löschen allgemeiner Integritätsregeln und Constraints)

mengentheoretische Operatoren

INTERSECT und EXCEPT (Durchschnitt und Differenz) - Scroll Cursor

neue skalare Funktionen

für arithmetische, Zeit- und Kettenoperanden (z. B. SUBSTR, LENGTH)

Transaktionen

SET TRANSACTION (Setzen des Modus der Transaktionensteuerung)

temporäre Tabellen (auch Views)

dynamisches SQL

Die meisten dieser SQL2-Forderungen sind bereits 1988 im DBMS MIMER realisiert worden. Andererseits erfüllen auch andere DBMS einige Forderungen von SQL2. Ein vollständiger Überblick über die verschiedenen Implementationen und die Erfüllung der verschiedenen SQL-Standards ist aufgrund der Dynamik in der Entwicklung von Datenbankbetriebssystemen de facto nicht zu erarbeiten.

Vereinbarungen über die Metasprache

Zur syntaktischen Beschreibung einer Programmiersprache benötigt man eine Metasprache, d. h. eine Sprache zur Beschreibung der eigentlichen Sprache, hier SQL. Wir verwenden für die Beschreibung von SQL fast ausschließlich Syntaxgraphen.
Obgleich davon ausgegangen wird, dass Sie den Umgang mit einer Metasprache beim Erlernen einer Programmiersprache bereits kennengelernt haben, sollen einige wenige Erläuterungen vorangestellt werden.
Die folgenden Syntaxgraphen werden - wenn durch Pfeilrichtung nicht ausdrücklich anders angegeben - von links nach rechts durchlaufen.

Schlüsselwörter (z. B. CREATE) werden in Großbuchstaben, die anderen Angaben in Kleinbuchstaben geschrieben; Variable für Schlüsselwörter (z. B. KEYWORD_ 1) werden durch kursive Großbuchstaben, die anderen Variablen durch kursive Kleinbuchstaben dargestellt. Hier die Basiskonstrukte der Metasprache:


 

Dies ist ein einzelnes Schlüsselwort in der syntaktischen Beschreibung, z. B. CREATE. Das Schlüsselwort muss von jedem anderen Schlüsselwort oder Parameter durch mindestens ein Leerzeichen oder einen Tabulatorstop getrennt sein.

Dies bedeutet ein Schlüsselwort, gefolgt von einer Kette, die durch mindestens ein Leerzeichen voneinander getrennt sind

Verzweigte Linien zeigen alternative Konstruktionen an. Bei einem Durchgang kann nur einer der hier beiden Wege verfolgt werden. Entweder wird option _1 oder option _2 ausgeführt. Dieses Diagramm kann beliebig um weitere options ergänzt werden.

Dies repräsentiert eine Liste von Parametern, d.h. die Schleife wird beliebig oft durchlaufen. Wenn mehr als ein Parameter auftritt, sind diese durch Komma zu trennen. Wenn ein Komma oder ein anderes Trennzeichen in einer Liste spezifiziert ist, müssen zwischen den Elementen der Liste Leerzeichen nicht auftreten.

Drei Punkte am Anfang einer Zeile im Diagramm zeigen an, dass die Zeile eine Fortsetzung der vorhergehenden Zeile ist.

Drei Punkte am Ende einer Zeile im Diagramm zeigen an, dass die Zeile eine Fortsetzung auf der folgenden Zeile hat.

Pfeilspitzen am Anfang und Ende einer syntaktischen Konstruktion, die über beliebig viele Zeilen notiert sein kann, zeigen an, dass das Konstrukt eine Komponente einer umfassenderen Konstruktion ist und allein nicht verwendet werden kann. Die Pfeilspitzen sind nicht Teil der Statementsyntax.

Linien ohne Pfeilspitzen oder ohne Punkte am Anfang oder Ende eines Diagramms, das über beliebig viele Zeilen notiert sein kann, zeigen an, dass das Statement dort beginnt oder endet. Fortsetzungszeilen sind durch drei Punkte gekennzeichnet.

Erläuterungen

  • Variable für Schlüsselwörter (z. B. KEYWORD_1) sind jeweils durch die (reservierten) Wörter zu ersetzen

  • option_1 usw. bzw. parameter sind bei der Anwendung entsprechend den aktuellen Bedürfnissen durch den Anwender durch zulässige Sprachelemente zu ersetzen

  • Sonderzeichen (z.B. Komma ',' und runde Klammern '(' bzw. ')') sind unverändert zu übernehmen

  • Kommentare werden, wenn erforderlich, hinter zwei Bindestriche geschrieben. Beispiel für ein zusammengesetztes Konstrukt

Erläuterung:

Das Konstrukt stellt ein vollständiges Statement dar. Hinter KEYWORD_1 müssen ein oder mehrere parameter stehen, die in runde Klammern einzuschließen und durch Kommas zu trennen sind. Es folgt danach option_1 oder option_2, danach das KEYWORD_2, gefolgt von einem string (Trennzeichen mindestens ein Leerzeichen). Schließlich ist das Statement beendet oder es folgt option_3 oder option_4.


2. Basiskonstrukte der Standard SQL history menue scroll up

Im Zuge allgemeiner Informationen wird unter diesem Punkt auf weiter unten enthaltene Informationen zurückgegriffen. So gut es möglich ist, werden diese aber durch eine Linkstruktur ergänzt und dort auch auf dann konkrete Beispiele verwiesen.

Basiselemente
Element Bedeutung
Variable arithmetische und Kettenvariable
Operatoren arithmetische, Ketten-, Vergleichs- und logische Operationen
Festwerte Konstante, Hostvariable (Hostvariable, d. h. Variable der Wirtssprache: in ESQL verwendet), USER (Aktueller Nutzer), SITE (Aktueller Ort bei verteilten Datenbanken)
Set-Funktionen AVG, COUNT, MAX, MIN, SUM (Auch Aggregatfunktionen genannt)
Ausdrücke allgemeine Wertspezifikationen
Prädikate (Prädikat wird hier immer im mathematisch-logischen Sinn verwendet) bedingte Statements (Basis-, quantifizierte, BETWEEN-, IN-, LIKE-, NULL-, EXISTS-Prädikate)
Suchbedingungen zusammengesetzte Prädikate, die Untermengen von Tabellenzeilen definieren
Subselects Sprachelemente, die Zeilen/Spalten-Untermengen aus Tabellen definieren
Select-Statements Kombination von einem oder mehreren Subselects
Basisdatentypen  - Die Bereiche sind implementationsabhängig (DBMS, Rechnerplattform, Betriebssystem).
Datentyp Beschreibung Bereich (Gültigkeitsbereich)
CHARACTER(n) Zeichenkette 1 <= n <= 503 mit n = Länge der Kette
INTEGER(p) ganzzahlig numerisch Darstellung in 4 Byte Genauigkeit p 65.536 bis 65.535
SMALLINT kurz ganzzahlig numerisch Darstellung in 2 Byte -255 bis 254
NUMERIC(p,s) numerisch 1 <= p <= 45
DECIMAL(p,s) dezimal 1 <= p <= 45 (für beide gilt: Genauigkeit p; Skala s 0 <= s <= p (s - Stellen nach Dezimalpunkt)
FLOAT(p) Gleitkomma 1 <= p < 45 mit p Genauigkeit der Mantisse
REAL   Gleitkomma doppelter Genauigkeit
DOUBLE PRECISION    

Anmerkungen zur Tafel (denn es ist tendenziell zu erkennen, dass der jeweiligen Implementation große Freiheiten eingeräumt werden.):

  1. CHAR oder VARCHAR ist ein Synonym für CHARACTER.

  2. DEC ist ein Synonym für DECIMAL.

  3. INT ist ein Synonym für INTEGER.

  4. Die Angaben zu Länge und Genauigkeit müssen größer als 0 sein.

  5. Fehlt beim Datentyp CHARACTER die Längenangabe, so wird die Länge 1 angenommen.

  6. Wird bei den Datentypen NUMERIC und DECIMAL keine Skala (keine Dezimalstellen) angegeben, wird 0 angenommen.

  7. Bei den Datentypen NUMERIC und DECIMAL darf die Skala die Genauigkeit nicht übersteigen.

  8. Durch NUMERIC wird ein exakter numerischer Datentyp entsprechend den gewählten Genauigkeiten und Skalen definiert.

  9. Durch DECIMAL wird ein exakter numerischer Datentyp entsprechend den Parametern definiert, dessen Genauigkeit kleiner oder gleich dem spezifizierten Genauigkeitswert ist. DECIMAL und NUMERIC unterscheiden sich darin, dass sich die tatsächliche Genauigkeit des Datentyps DECIMAL nach der Vorgabe des jeweiligen Herstellers richtet, was für NUMERIC nicht zutrifft.

  10. Die Angabe INTEGER dient der Festlegung eines exakten numerischen ganzzahligen Datentyps mit einer herstellerabhängigen Genauigkeit und einer Skala 0.

  11. SMALLINT führt zur Festlegung eines exakten numerischen Datentyps, dessen Genauigkeit herstellerabhängig ist und diejenige von INTEGER nicht übertrifft. Die Skala ist 0.

  12. Durch FLOAT wird ein näherungsweiser numerischer Datentyp spezifiziert, dessen binäre Genauigkeit größer bzw. gleich der angegebenen Genauigkeit ist.

  13. Die Angabe REAL dient der Festlegung eines näherungsweesen Datentyps mit herstellerspezifischer Genauigkeit.

  14. Durch DOUBLE PRECISION wird ein näherungsweiser numerischer Datentyp mit herstellerspezifischer Genauigkeit definiert, die die herstellerspezifische Genauigkeit des Datentyps REAL übertrifft.

Gefordert werden die in der Tafel dargestellten Basisdatentypen lt. Standard genannten Datentypen

Der NULL-Indikator wird wie folgt geschrieben:

NULL bezeichnet den unbestimmten Wert, nicht aber die leere Zeichenkette bzw. die numerische Null. Die Datentypen definieren, in der Regel mit ihrer Längenangabe, den Wertebereich (Domain) einer Spalte.
Außer diesen Standarddatentypen findet man, z. B. bei den DBMS INFORMIX oder SYBASE, weitere Datentypen. Zu nennen sind Datums- und Zeit-Datentypen und der Datentyp VARCHAR für variable Zeichenkettenlänge. Zu diesen Datentypen werden an anderer Stelle weitere Angaben gemacht.
Erstmals standen 1990 bei INFORMIX-OnLine Datentypen zur Verfügung, die es gestatten, in Datenbanken große binäre Objekte zu definieren. Bekannt sind diese unter dem Namen Binary Large Objects, abgekürzt: Datentyp BLOB. Bei INFORMIX-OnLinie kann der Datentyp BLOB in zwei Arten benutzt werden:
Subtyp TEXT erlaubt Objekte, die druckbare Zeichen sowie Steuercodes für Neue Zeile und Neue Seite enthalten; dieser Datentyp ist geeignet zur Verwaltung von Dokumenten und z. B. von Programm-Quellcodes.
Subtyp BYTE erlaubt Objekte, die durch beliebige Bitmuster dargestellt werden; dieser Datentyp kann beliebige graphische Objekte, gescannte Objekte, digitalisierte fotographische Objekte, digitalisierte Sprache, Musik usw. aufnehmen. Ebenso können Programm-Moduln abgespeichert werden, die in irgendeinen internen Code übersetzt worden sind. Offenbar bietet sich dieser Datentyp auch für Multimedia-Anwendungen an.
In der Zwischenzeit wird der Datentyp BLOB auch bei anderen DBMS angeboten: SYBASE, ORACLE (z. Z. noch mit Einschränkungen), dem PC-DBMS ACCESS (sehr gut anwendbar).

Domains (Wertevorräte)

Entsprechend späterer SQL-Standards wird ein Statement zur Definition benutzereigener Domains eingeführt - das CREATE DOMAIN-Statement. Damit kann man weitere Datentypen auf der Grundlage der Standarddatentypen definieren und Prüfklauseln (CHECK-Clauses) sowie Standardwerte (default values) einführen, wodurch die Integrität der Datenbank unterstützt wird.


3. Identifer, Operatoren und Funktionen history menue scroll up

Konsistenz garantiert Widerspruchsfreiheit. Niemals  - auch nur kurzzeitig gibt es den Zustand, in welchem die Inhalte relational miteinander verknüpfte Tupel einander widersprechen. Idealerweise organisiert dies das DBMS selbst oder überwacht zumindest die konsequente Einhaltung selbiger.

Identifier sind Bezeichner (Namen) für die verschiedenen Objekte eines DBMS. Im allgemeinen gilt, dass Identifier, die das Betriebssystem des Rechners erkennen muss, an dessen Konventionen gebunden sind und meistens 8 Zeichen lang sein können, während Identifier, die das DBMS erkennen muss, größere Längen gestatten, z. B. 18 Zeichen bei den meisten DBMS, aber bei MS-ACCESS bis zu 64 Zeichen. Identifier müssen i. allg. mit einem Buchstaben beginnen und können danach Buchstaben oder Ziffern sowie das Unterstreichunszeichen ('_') enthalten. Dabei spielt es keine Rolle, ob Buchstaben am Rechner als Groß- oder Kleinbuchstaben getippt werden, weil die meisten DBMS eine automatische Konvertierung in Großbuchstaben vornehmen, manche (unter einem UNIX-System) konvertieren auch in Kleinbuchstaben. Nicht konvertiert werden jedoch Zeichenketten in Anführungszeichen. Das Passwort, in der Regel maximal 8 Zeichen und minimal 4 Zeichen lang, muss jedoch so getippt werden, wie es definiert ist und kann alle Zeichen in beliebiger Mischung enthalten; es ist bei der Spezifikation in Hochkommas einzuschließen. Das Passwort dient der geheimen Identifikation des Nutzers und wird zusammen mit dem Nutzernamen verwendet, um Zutritt zum Datenbanksystem zu bekommen, falls dieser unter diesen Identifikationsmerkmalen im System bekannt ist. Die Tafel unten enthält die Angaben zu den in den SQL-Standards verwendeten Identifier (es werden die englischen Typnamen beibehalten).

Tafel Identifier-Übersicht

Basisdatentypen  - Die Bereiche sind implementationsabhängig (DBMS, Rechnerplattform, Betriebssystem).
Name max. Länge in Zeichen Beschreibung
colum_name 18 der Name einer Spalte in einer Tabelle o. View (Sicht)
correlation_name 18 ein alternativer Name für eine Tabelle oder View, oder für eine Menge Zeilen einer Tabelle oder View
cursor_name 18 der Name eines Cursors (ESQL)
databank_name vormals 8 heute 10 der Name einer Datenbank
domain_name (*) 18 der Name eines Domains
ident_name (*) 8 der Name einer Nutzer-, Gruppen- o. Programm-Idents
group_name (*) 8 der Name eines Gruppenidents
index_name 18 der Name eines (Sekundär-)Index
program_name 8 der Name eines Programmidents
statement_name 18 der Name eines vorbereiteten SQL-Statements (ESQL)
synonym_name 18 der Name eines Synonyms für eine Tab.- Bezugnahme
table_name 8 der Name einer Basistabelle
table_reference 18 der Name einer Tabelle, View oder eines Synonyms
view_name 18 der Name einer View (Sicht)

Für Identifier findet man auch den deutschen Begriff "Bezeichner"

Anmerkung:

In der Tabelle sind die Identifier mit einem Stern (") gekennzeichnet, die z. Z. nicht in allen hier betrachteten DBMS implementiert sind oder wo die Funktion auf andere Weise gegeben ist. In dem unter Windows laufenden DBMS MS-ACCESS gelten wesentlich erweiterte Längen, i. allg. bis zu 64 beliebige Zeichen, einschl. Leerzeichen. Leerzeichen sind normalerweise Trennzeichen. Um trotzdem Bezeichner, etwa der Form für einen Tabellennamen Tabelle der Studenten verwenden zu können, sind dann Bezeichner in Anführungszeichen zu setzen: "Tabelle der Studenten".

Operatoren:

Zur Arbeit mit einem DBMS sind folgende Operatoren erforderlich und, entsprechend dem Standard, mindestens in nachfolgend genannten Formen vorhanden.

Arithmetische und Kettenoperatoren    
unary arithmetische 1 + lässt den Operanden unverändert
  - kehrt das Vorzeichen um
binary arithmetisch 2 + Addition
  - Subtraktion
  * Multiplikation
  / Division
Kettenoperator !! 3 Verkettung
Vergleichs- und Beziehungs- (relational) operatoren
Vergleichsoperatoren  = gleich
  <> 4 ungleich
  < kleiner als
  <= kleiner oder gleich
  > größer als
  >= größer oder gleich
Beziehungsoperatorens BETWEEN  
  EXISTS  
  IN  
  IS LIKE  
Logische Operatoren 5 AND logisch und
  OR logisch oder
  NOT logisch nicht

 
1 unary bedeutet: Operator in Verbindung mit nur einem Operanden (also + oder - als Vorzeichen).
2 binary bedeutet: Operator in Verbindung mit zwei Operanden, in der Regel zwischen die Operanden geschrieben (also + für Addition, - für Subtraktion usw.).
3 Der Verkettungsoperator wird auch anders dargestellt, z. B. durch & oder ||, teilweise auch durch die Funktion
CONCAT().
4 Alternativ dargestellt durch |= oder abhängig vom DBMS.
5 Auch als Boolesche Operatoren bezeichnet.

Funktionen

Vom Standard gefordert sind Set-Funktionen (Aggregat-Funktionen - auf Mengen angewendete und aggregierende Funktionen); teilweise gibt es weitere Funktionen dieser Art. Diese neueren Funktionen beziehen sich auf die Arbeit mit den Datentypen DATE, TIME bzw. DATETIME, auf die Steuerung der Konvertierung zwischen Datentypen, auf die Arbeit mit Zeichenketten, auf die Arbeit mit mathematischen Funktionen usw. Diese Erweiterungen gegenüber dem Standard sind im wesentlichen vom konkreten DBMS und den dort angebotenen Datentypen abhängig.

Set-Funktionen (Aggregat-Funktionen)

Das volle Verständnis dieser Funktionen wird später erreicht, nachdem deren Anwendungen in anderen Konstrukten gezeigt worden ist.
Funktionen in diesem Zusammenhang sind mengenbezogene Funktionen in dem Sinne, dass über spezifizierte Spalten und ausgewählte Zeilen Operationen ausgeführt werden. Eine Ausnahme bildet die Set-Funktion COUNT(), die lediglich die Anzahl Treffer, bezogen auf eine Zeilenauswahl, bestimmt. Die Set-Funktionen werden in Abfrage-Statements (SELECT-Statements und Subselects) verwendet. Sie wirken auf Wertemengen in einer Spalte der Ergebnismenge einer Abfrage oder auf Untermengen (Gruppen), wenn das SELECT-Statement eine GROUP BY-Klausel und/oder HAVING-Klausel enthält. Das Ergebnis einer Set-Funktion ist ein einzelner Wert für jede Menge des Operanden. Die Set-Funktionen des Standards sind:

  • SUM Summation
  • MAX Maximalwert
  • MIN Minimalwert
  • AVG Durchschnitt
  • COUNT Zählen der Treffer

Manche DBMS unterstützen weitere Set-Funktionen, z.B. gewichtete Durchschnitte und gewichtete Summen, die sich auf jeweils zwei Spalten beziehen. Hier die allgemeine Syntax der Set-Funktionen:

Erläuterung:

  • wenn ALL oder nichts spezifiziert ist, werden Duplikatwerte in der Operandenmenge berücksichtigt.

  • ist DISTINCT spezifiziert ist, werden (redundante) Duplikatwerte aus der Operandenmenge eliminiert, bevor die Funktion angewendet wird

  • expression bedeutet einen Ausdruck, wie er im folgenden Abschnitt erklärt wird.

Für die Set-Funktionen MAX und MIN ist das Schlüsselwort DISTINCT irrelevant und sollte bzw. muss vermieden werden.
Eine besondere Form der COUNT-Funktion ist COUNT(*); sie gibt die Anzahl Zeilen unter Berücksichtigung der NULL-Indikatoren zurück, d. h. es werden alle Trefferzeifen gezählt. Für alle Set-Funktionen (außer COUNT(*)) werden NULL-Werte in der Operandenmenge eliminiert, bevor die Set-Funktion angewendet wird, unabhängig davon, ob DISTINCT spezifiziert ist oder nicht. Wenn die Operandenmenge leer ist; gibt die COUNT-Funktion den numerischen Wert Null zurück. Die anderen Funktionen liefern den unbestimmten Wert NULL.

Sonstige Funktionen

Insbesondere für die Datentypen TIME, DATE und DATETIME, aber auch für den Datentyp Zeichenkette gibt es, in den DBMS unterschiedlich implementiert, eine Anzahl weiterer Funktionen.
Eine besondere Kategorie sind die Funktionen zur Konvertierung der Datentypen untereinander. Bedingung ist dabei die Kompatibilität der Daten. Z. B. ist es natürlich nicht möglich, eine allgemeine Zeichenkette in eine Zahl zu konvertieren, während das für eine Kette mit ausschließlich Ziffern und Vorzeichen möglich ist. Viele dieser Konvertierungsfunktionen werden automatisch angewendet. Aber auch dies hängt vom jeweiligen DBMS ab.


4. Basiskonstrukte history menue scroll up

In SOL werden Ausdrücke in den verschiedensten Zusammenhängen verwendet, z. B. in Suchbedingungen (search conditions) und in der SET-Klausel eines UPDATE-Statements. Ein Ausdruck liefert immer einen einzelnen Wert.

Ausdrücke

Erläuterung:

fixed_value (Festwert, Konstante), column_name (Spaltenname), set function (Mengenfunktion) und (expression) (rekursiv verwendet, d. h. Funktion in Funktion eingesetzt) sind die Operanden des Ausdruckes.
Die Unary-Operatoren Plus und Minus werden als Vorzeichen verwendet Eine numerische Konstante wird als fixed_value ohne Vorzeichen angegeben. Der Operand eines Binary-Operators darf nicht eine Funktion sein, die das Schlüsselwort DISTINCT enthält.
Hat der Operand den Wert USER, so ist dies eine Zeichenkette der Länge 8 und enthält den Namen des aktuellen Nutzers.
Wenn ein Spaltenname als Operand verwendet wird, bezieht er sich bei der Auswertung des Ausdruckes auf den einzelnen Wert in der Spalte für die aktuell adressierte Zeile. Der Spaltenname kann mit dem Namen der Tabelle oder View qualifiziert sein (d. h. die "Adresse" wird durch ein weiteres Merkmal ergänzt - entsprechend am Beispiel einer Postanschrift: Land - Ort - Straße - Hausnummer - Etage usw.).
Die Notation ist dann table_reference.column_name; muss der Creator der Tabelle oder View zur eindeutigen Identifikation herangezogen werden, muss die Tabelle qualifiziert werden creator.table_reference.column_name.
Werden arithmetische Ausdrücke ausgewertet, so werden Ausdrücke in runden Klammern zuerst berechnet. Sind keine Klammern angegeben, so erfolgt die Auswertung mit den üblichen Regeln: Multiplikation und Division vor Addition und Subtraktion. Wenn ein Operand in einem Ausdruck NULL ist, ist der gesamte Ausdruck NULL. Die Berechnung von Ausdrücken, die verschiedene numerische Datentypen enthalten, wird nach evtl. erforderlichen Konvertierungen durchgeführt. Dazu sind die jeweiligen Handbücher der DBMS einzusehen.

Beispiel:

... mitarb_gehalt * 1.2 ..

Das Basisprädikat

Wir erinnern daran, dass der Begriff Prädikat im mathematisch-logischen Sinne zu verstehen ist.Prädikate sind bedingte Ausdrücke, die die Werte TRUE (wahr), FALSE (falsch) oder NULL (unbekannt) annehmen können. Beachte: NULL ist der unbestimmte Wert, nicht die numerische Null! Ein unbestimmter Wert zu einem bestimmten Wert addiert, ist natürlich wieder ein unbestimmter Wert. Prädikate werden zur Bildung von Suchbedingungen in WHERE-, HAVING- und CHECK-Klauseln verwendet.
Ein Basisprädikat vergleicht einen Wert mit einem und nur einem anderen Wert; es hat folgende Form:


comp_operator steht für einen Vergleichsoperator, wie er in Abschnitt oben eingeführt wurde. Die Ausdrücke auf den beiden Seiten des Vergleichsoperators müssen datenkompatibel sein. Verwendet man die Form mit subselect, so muss das Ergebnis entweder eine leere Menge oder ein einzelner Wert sein. Das Ergebnis des Prädikates ist unbekannt, wenn entweder die Ausdrücke den Wert NULL ergeben oder wenn das spezifizierte Subselect die leere Menge zurück gibt.

Beispiele:

name = 'Schulze'
SUM(gehalt) * differenz < 25000

name, gehalt sind hier Spaltennamen; differenz ist ein numerischer Ausdruck; die Ergebnisse sind hier entweder wahr oder falsch!

Quantifizierte Prädikate

Ein quantifiziertes Prädikat verwendet die Operatoren ALL, ANY oder SOME und vergleicht einen Ausdruck mit einer Wertemenge, die durch das spezifizierte Subselect erzeugt wird, d.h. es wird dann verwendet, wenn nicht nur auf einen einzigen Wert der Ergebnismenge, sondern auf alle (ALL) oder einige (ANY, alternativ SOME) von mehr als einem Wert verglichen werden muss.

Im Zusammenhang mit einem quantifizierten Prädikat muss das Subselect entweder eine leere Menge oder eine Menge von einzelnen Werten zurückgeben.

Das ALL-Prädikat:

Das Ergebnis ist wahr, wenn das Subselect eine leere Menge liefert oder wenn der Vergleich für jeden Wert, der vom Subselect zurückgegeben wird, wahr ist.
Das Ergebnis ist falsch, wenn der Vergleich mindestens für einen der zurückgegebenen Werte falsch ist.
Das Ergebnis ist unbekannt, wenn irgendeiner der zurückgegebenen Werte NULL ist und kein Wert falsch ist.

Das ANY-Prädikat oder SOME-Prädikat:

Die Schlüsselwörter ANY und SOME sind äquivalent (synonym).
Das Ergebnis ist wahr, wenn der Vergleich für mindestens einen der durch das Subselect zurückgegebenen Werte wahr ist.
Das Ergebnis ist falsch, wenn das Subselect eine leere Menge erzeugt oder wenn der Vergleich für jeden zurückgegebenen Wert falsch ist.
Das Ergebnis ist unbekannt, wenn die zurückgegebenen Werte des Subselect NULL sind und kein Wert wahr ist.

Die Prädikate IN, LIKE, BETWEEN, NULL, EXISTS

Diese Prädikate gestatten in vielen Fällen eine wesentlich komprimiertere Schreibweise; sie sind teilweise unverzichtbar zur Formulierung bestimmter Abfragebedingungen.

Das BETWEEN-Prädikat:

Dieses Prädikat testet Ergebnisse, ob ein Wert (einer kontinuierlichen, zusammenhängenden Menge) innerhalb eines Bereiches von Werten, die Grenzen eingeschlossen, liegt oder nicht.

Das BETWEEN-Prädikat ist eine verkürzte Schreibweise für die direkte Angabe mit Basisprädikaten:

  • BETWEEN a1 AND a2  - ist äquivalent zu x >= al AND x <= a2
  • NOT BETWEEN a1 AND a2 ist äquivalent zu x < a1 OR x > a2

Das Ergebnis des BETWEEN-Prädikates ist unbestimmt, wenn die äquivalenten Basisprädikate ein unbestimmtes Ergebnis liefern.

Beispiel:

gehalt BETWEEN 1500.00 AND 2300.00

Das IN-Prädikat:

Dieses Prädikat testet, ob ein Wert in einer Menge diskreter Werte enthalten ist oder nicht.

Wenn die Menge der Werte auf der rechten Seite des Vergleichs als eine explizite Liste gegeben ist, kann das IN-Prädikat immer durch eine Menge von Basisprädikaten ausgedrückt werden, die durch die logischen Operatoren AND oder OR verbunden sind:

  • IN (a1,a2,a3)  - ist äquivalent zu x = a1 OR x = a2 OR x = a3
  • NOT IN (a1,a2,a3) ist äquivalent zu x <> a1 AND x <> a2 AND x <> a31

Wenn die Menge der Werte durch ein Subselect zurückgeben wird, ist ein IN-Prädikat äquivalent zu einem quantifizierten Prädikat:

  • IN (subselect) - ist äquivalent zu x = ANY (subselect]
  • NOT IN (subselect) - ist äquivalent zu x <> ALL (subselect)

<> ist hier verwendet worden als Schreibweise für ungleich.

Beispiel:

  • ort IN ('Leipzig', 'Dresden', 'Chemnitz')

Ausgewählt werden die Wohnorte mit den Namen Leipzig, Dresden oder Chemnitz.

Das LIKE-Prädikat:

Das LIKE-Prädikat vergleicht den Wert eines Zeichenkettenausdruckes mit einem Zeichenkettenmuster (als fixed_value - Konstante), das i. allg. sogenannte Joker-Symbole oder Wildeards (als Platzhalter) enthält.

Der Ausdruck auf der linken Seite des LIKE-Operators muss ein Kettenausdruck sein. Der Festwert auf der rechten Seite ist eine Kettenkonstante oder eine Hostvariable (ESQL) oder das Schlüsselwort USER. Es können folgende Jokersymbole verwendet werden:

  • Unterstreichungszeichen _ steht für ein einzelnes beliebiges Zeichen
  • Prozentzeichen % steht für eine beliebige Folge aus null oder beliebig vielen Zeichen

Beispiele:

  • name LIKE 'M%r' - ausgewählt werden Namen, die mit M beginnen und mit r enden, z. B.: Meier, Meyer, Maier, Mayer, Meir.
  • name LIKE 'M_ier' - ausgewählt werden aus fünf Buchstaben bestehende Namen, die mit M beginnen und auf ier enden, z. B. Meier, Maier, aber nicht Meyer, Mayer, Meir.
  • firma LIKE '%Universität%' - ausgewählt werden Firmen (hier Universitäten) die mit einer beliebigen Anzahl beliebiger Zeichen beginnen und nach Universität beliebig viele beliebige Zeichen enthalten, z. B.: Technische Universität Dresden, Universität Leipzig, Technische Universität Bergakademie Freiberg

Das NULL-Prädikat:

Das NULL-Prädikat vergleicht den Wert einer Spalte mit dem NULL-Indikator; es bietet in einem dem Standard entsprechenden DBMS die einzige Möglichkeit, auf unbestimmte Werte zu testen.

Wenn das Prädikat 'expression IS NULL' spezifiziert ist, dann ist das Ergebnis wahr, wenn irgendein Operand des Ausdruckes NULL ist. Das Ergebnis ist falsch, wenn kein Operand im Ausdruck NULL ist. Das Ergebnis des NULL-Prädikates ist niemals unbekannt.
Das
NULL-Prädikat ist die einzige Möglichkeit zu testen, ob in einer Spalte ein NULL-Indikator vorkommt. Alle anderen Prädikate liefern für diesen Fall den Wert unbekannt.

Beispiel:

  • kinder IS NULL - das Ergebnis ist für die Tabelle MITARB falsch, weil in jeder Zeile die Spalte KINDER belegt ist.

Das EXISTS-Prädikat:

Das EXISTS-Prädikat prüft, ob die Menge von Werten, die durch ein Subselect zurückgegeben wird, leer ist oder nicht.

Das Ergebnis ist wahr, wenn das Subselect nicht die leere Menge zurückgibt. Sonst ist das Ergebnis falsch. Eine Menge von ausschließlich NULL-Werten ist nicht leer. Deshalb ist das Ergebnis niemals unbekannt.
Das
EXISTS-Prädikat ist das einzige Prädikat, das einen Wert nicht mit einem oder mehreren anderen Werten vergleicht. Eine Spaltenangabe im Subselect ist irrelevant. Deshalb sollte kurz geschrieben werden: SELECT *. Durch das EXISTS-Prädikat wird gefragt, ob die Ergebnismenge eines Subselects leer ist oder nicht; dies wird dann zur Steuerung der weiteren Abfrage verwendet.
Grundsätzlich ist auch NOT EXISTS möglich. Dies ist jedoch mit großer Vorsicht zu tun, besonders dann, wenn leere Ergebnismengen auftreten - also am besten nicht verwenden.

Beispiel:

EXISTS (SELECT* FROM mitarb WHERE kinder > 5) - das Ergebnis ist falsch, weil kein Mitarbeiter in der Tabelle MITARB mehr als 5 Kinder hat.

Für die Auswahl ist nur die WHERE-Klausel relevant. Die Spalten sind irrelevant.
An diesem Beispiel wollen wir die wichtige Funktion des Select - der Abfrage - kurz erläutern. SQL arbeitet auf der Basis der englischen Sprache. Deshalb ist das Select wie folgt zu lesen:
Wähle aus (
SELECT) alle Spaltenwerte (Stern ') aus der Tabelle MITARB (FROM), für die die Spalte KINDER einen Wert > 5 (WHERE) enthält. Es ist zu erkennen, dass einfache Abfragen relativ leicht zu formulieren sind. Komplizierte Abfragen wird sich der Lernende schrittweise erarbeiten können bzw. müssen. Das Schlüsselwort EXISTS vor der Klammer bezieht sich auf das Ergebnis der Abfrage: Existiert in der Tabelle eine Zeile, in der der Wert in der Spalte KINDER > 5 ist, so liefert das EXISTS-Prädikat ein Ergebnis wahr, sonst falsch. Nehmen wir die Konstrukte der Prädikate zusammen, so gibt es eine Anzahl Äquivalenzen, d. h. Alternativformulierungen in den Statements:
Quantifizierte Prädikate können immer durch alternativ mit
EXISTS (siehe nächsten Abschnitt!) formulierte Prädikate ersetzt werden. Allgemein gelten folgende Äquivalenzen:

  • die Suchbedingungen 'x IN S' und 'x = ANY S' sind identisch.
  • die Suchbedingungen 'x NOT IN S' und 'x <> ALL S' sind identisch.
  • die Suchbedingung 'x IS NULL' liefert logisch wahr, falls x gleich dem NULL-Wert ist.
  • falls das Zeichen & ein willkürlich gewählter Vergleichsoperator, S ein Subselect mit den Ergebniswerten {s1, s2, ... , sn} ist, so folgt, dass 'x & ANY (S)' mit 'x & s1 OR x & s2 OR ... OR x & sn' identisch ist.
  • falls das Zeichen & ein willkürlich gewählter Vergleichsoperator und S ein Subselect mit den Ergebniswerten (s1, s2, ... , sn) ist, so folgt, dass 'x & ALL (S)' mit 'x & s1 AND x & s2 AND ... x & sn' identisch ist.
Suchbedingungen

Suchbedingungen (search_conditions) werden in WHERE- und HAVING-Klauseln von SELECT-Statements und Subselects verwendet, um die Zeilen in Tabellen Views bzw. Gruppen zu selektieren, sowie in CHECK-Klauseln, um zulässige Werte zu definieren.
Eine Suchbedingung besteht aus einem oder mehreren Prädikaten, die durch die logischen Operatoren AND und OR, evtl. kombiniert mit NOT, verbunden sind.

Erläuterung:

predicate steht für irgendeines der eben behandelten Prädikate. (search condition) steht für die rekursive Verwendung, d. h., es können beliebig komplexe Suchbedingungen schrittweise aufgebaut werden. Sind Konstruktionen mit mehreren AND, OR oder NOT zu bilden, so kann man die Auswertung mittels runder Klammern steuern. Das entspricht im Prinzip der Arbeit mit Klammern in arithmetischen Ausdrücken. Hier werden Bedingungen in runden Klammern zuerst ausgewertet, auf gleicher Klammerebene wird NOT vor AND und AND vor OR angewendet.

Beispiel für die Bedingung in einer WHERE-Klausel:

Es sollen diejenigen Zeilen aus der Tabelle MITARB ausgewählt werden, für die der Mitarbeiter mehr als 2 und weniger als 5 Kinder hat, in der Abteilung KON1 arbeitet, verheiratet ist und das Gehalt zwischen 2000 und 3000 (einschließlich) liegt oder der Mitarbeiter eine Postleitzahl hat, die mit 0 beginnt.

Lösung:

WHERE kinder > 2 AND kinder < 5 AND abtnr = 'KON1' AND famst = 'V'
AND gehalt >= 2000
AND gehalt <= 3000
OR plz LIKE '0%'

WHERE- und HAVING-Klauseln suchen die Menge von Werten, für die die Suchbedingung wahr ist. In CHECK-Klauseln von DOMAIN-Statements definieren Suchbedingungen die Menge von Werten, für die die Bedingung nicht als falsch berechnet wird, also entweder wahr oder unbekannt ist.


5. Subselects history menue scroll up

Das Konstrukt Subselect wird vor allem in SELECT-Statements, aber auch in vielen anderen Statements (INSEKT, UPDATE, DELETE, CREATE VIEW) als Komponente (Substruktur) verwendet. Das Subselect ist ein sehr komplexes Konstrukt; es hat folgende Klauseln: notwendig SELECT-Klausel
FROM-Klausel
optional WHERE-Klausel GROUP BY-Klausel HAV ING-Klausel
Im Subselect werden u. a. die relationalen Operationen Projektion (in SELECT-Klausel), Selektion und Join (beide in der WHERE-Klausel) spezifiziert.

Die SELECT-Klausel

Mit der SELECT-Klausel des Subselects wird spezifiziert, welche Werte selektiert werden sollen; es wird die relationale Operation Projektion ausgeführt. Werte werden durch Angabe der Spaltennamen oder durch Ausdrücke spezifiziert, wie im Diagramm zu sehen ist.

Erläuterung:

Die SELECT-Klausel ist sehr komplex und formal schwer beschreibbar und durchschaubar. Es folgen deshalb zu jeder Alternative Beispiele, die sich auf die Beispieldatenbank FEDB beziehen.
Die Klausel AS label wird vom Standard (noch) nicht gefordert. In vielen DBMS darf das Schlüsselwort AS nicht stehen. In den Beispielen ist es deshalb weggelassen! SELECT*
Das Ergebnis dieser Abfrage liefert alle Spalten der in der FROM-Klausel angesprochenen Tabelle, und zwar in der Reihenfolge, wie die Spalten in der Tabelle definiert worden sind. Achtung:
Werden in der FROM-Klausel mehrere Tabellen angesprochen, so besteht das Ergebnis aus dem karthesischen Produkt aller Tabellen, d. h., jede Zelle der ersten Tabelle wird mit jeder Zeile der zweiten Tabelle zur Ergebnistabelle kombiniert usw. Ein solches Ergebnis ist i. allg. nicht erwünscht und kann schnell den Speicher zum Überlaufen bringen.
Im allgemeinen verwendet man SELECT * nicht, weil im Ergebnis meist nur bestimmte Spalten interessieren (die relationale Operation Projektion). Verwendet wird diese Form aber in EXISTS-Prädikaten (s. o.).

SELECT table reference.*

table_reference (Tabellenbezugnahme) ist in diesem Falle der Name einer Tabelle oder View. Es werden alle Spalten der durch table_reference angesprochenen Tabelle oder View ausgewählt, und zwar in der Reihenfolge ihrer Definition in CREATE TABLE- oder CREATE VIEW-Statements. Meistens wird diese Form kombiniert verwendet, wenn mehrere Tabellen/Views angesprochen werden.

SELECT table reference.column name, ...

Wie vorgenannt, jedoch werden nur die Spalten (über die Spaltennamen) ausgewählt, die in der Liste der SELECT-Klausel enthalten sind.

Beispiel:

SELECT mitarb.*, ...

Im Beispiel werden aus der Tabelle MITARB alle Spalten in der Reihenfolge der Tabellendefinition zurückgegeben. Wird anstelle des Tabellennamens (MITARB) die Form correlation name (zu übersetzen etwa mit "verbundener Name") verwendet, so muss dieser in der FROM-Klausel definiert werden (d. h. an den Tabellennamen gebunden werden, s. u.). SELECT ....expression, ...
Werte, die ausgewählt werden sollen, können als Ausdrücke (expression) spezifiziert werden. Man kann in den Ausdrücken Spaltenbezugnahmen (column_name),Set-Funktionen, Host-Variable (ESQL) und Konstante verwenden. Spaltennamen können oder müssen, wenn nötig, durch die Namen der Tabellen oder Views qualifiziert werden, um die richtige Auswahl zu treffen, wenn mehrere Tabellen oder Views in der FROM-Klausel zugeordnet werden. Sind in diesen Tabellen oder Views Spaltennamen identisch, so muss der Name qualifiziert werden.
Soll die Spalte der Ergebnistabelle, die aus einem Ausdruck berechnet wird, einen Namen erhalten, so ist die Konstruktion mit AS label name (in den meisten DBMS nur narre) zu verwenden.

Beispiel:

SELECT name, gehalt * 1.2 neues_gehalt

Im Ergebnis dieser Abfrage entstehen zwei Spalten mit den Spaltenbezeichnungen

NAME          NEUES_GEHALT

Die Spaltenwerte enthalten die Namen sowie das mit 1.2 multiplizierte Gehalt; Name und Gehalt sind Werte aus der Tabelle MITARB. Der Ausdruck gehalt * 1.2 wird in der Ergebnistabelle mit der Spaltenbezeichnung NEUES_GEHALT ausgegeben.

Die Schlüsselwörter ALL und DISTINCT

Wird ALL spezifiziert oder ist kein Schlüsselwort angegeben, werden die gewünschten Spaltenwerte aus allen Zeilen zurückgegeben, d. h., Duplikat-Zeilen werden aus dem Ergebnis eines Subselect nicht eliminiert. Wenn DISTINCT spezifiziert ist, werden Duplikat-Zeilen eliminiert; Mehrfachwerte werden nur einmal berücksichtigt.
In anderem Zusammenhang kann DISTINCT verwendet werden vergleiche dazu die:

  • Set-Funktionen in der Liste der selektierten Werte, in der SELECT-Klausel.
  • Set-Funktionen in der HAVING-Klausel.

Beispiele:

SELECT distinct abtnr

liefert, bezogen auf die Tabelle MITARB, die Übersicht über alle in der Tabelle vorkommenden Abteilungsnummern, wobei jede ABTNR nur einmal in der Ergebnistabelle vorkommt: KON1, KON2, KON3, FE1, FE2, RZ

SELECT abtnr

liefert, bezogen auf die Tabelle MITARB so viele Zeilen mit ABTNR, wie Zeilen selektiert werden - in der Regel ein unerwünschtes Ergebnis.

Die FROM-Klausel

Die FROM-Klausel definiert eine Zwischenergebnismenge (Diese ist für den Nutzer nicht sichtbar (transparent); sie existiert im Rechner nur für Zwecke der weiteren Berechnung) für das Subselect. Sie kann correlation-names für die Tabellenbezugnahmen spezifizieren, die in der Ergebnismenge verwendet werden. D. h., einer Tabelle oder View wird ein (kürzerer) weiterer Name zugeordnet.

Erläuterung:

Alle Basistabellen und Views, die in der SELECT-Klausel angesprochen werden, müssen in der FROM-Klausel notiert werden. Adressiert die table_reference eine View, deren Definition eine GROUP BY-Klausel enthält, darf keine weitere Tabelle oder View spezifiziert werden. Das Schlüsselwort AS ist in vielen DBMS nicht möglich. Es wird in den Beispielen weggelassen.

correlation name

Dies sind alternative Namen für table_references, die nur in dem Statement bekannt sind, wo sie definiert wurden. Werden mehrere correlation names erforderlich, so ist für die be¬treffende table_reference die Konstruktion entsprechend oft zu spezifizieren. Vergleiche das folgende Beispiel
correlation names (zugeordnete Namen zu Basistabellen und Views) dienen drei Zwecken:

1. Um die Schreibweise abzukürzen (dies ist wahlweise zu verwenden und dient der "Bequemlichkeit").

Beispiel:

SELECT mp.mnr, mp.pnr, m.mnr FROM mitpro mp, mitarb m ...

Erläuterung:

Mit MP wird die Tabelle MITPRO, mit M die Tabelle MITARB angesprochen. Bei komplizierten Abfragen gibt dies ersichtlich wesentliche Einsparungen an einzugebendem Text, und die Gefahr der fehlerhaften Eingabe (bei langen Namen) ist wesentlich verringert. Die obige verkürzte Form ist identisch mit

SELECT mitpro.mnr, mitpro.pnr, mitarb.mnr FROM mitpro, mitarb ..

In beiden Schreibweisen ist die noch nicht erklärte WHERE-Klausel weggelassen worden, die in der Regel erforderlich ist, weil zwei Tabellen angesprochen werden.

2. Um eine Tabelle auf sich selbst beziehen zu können (dann logisch zwingend erforderlich).

Beispiel:

Hierzu wählen wir eine andere Datenbasis aus dem Bereich Konstruktion mit den Tabellen STLIST (Stückliste) und PBEZ (Produktbezeichnung). Struktur der Tabelle STLIST3

  • PNRO Produktnummer des oberen Produkts
  • PNRU Produktnummer des unteren Produkts
  • ANZD Anzahl, in der das untere Produkt in das obere Produkt direkt eingeht
  • ANZT Anzahl, in der das untere Produkt in das obere insgesamt eingeht

Struktur der Tabelle PRODUKT

  • PNR Produktnummer irgendeines Produktes
  • PBEZ Name des Produkts

Gesucht sind die Produktnummern (PNRO) und Namen (PBEZ) aller oberen Produkte und die Produktnummern (PNRU) und Namen (PBEZ) der in das obere Produkt eingehenden unteren Produkte sowie die direkt eingehenden Stücke (ANZD)! Sind aus Gründen der Logik mehrere correlation_names erforderlich, so können sie wie in folgendem Beispiel vereinbart werden. Im Beispiel wird gleichzeitig die verkürzte Schreibweise verwendet.

Lösung:

SELECT s.pnro, p.pbez, s.pnru, pl.pbez, s.anzd
FROM produkt p, produkt p1, stlist s
WHERE p.pnr = s.pnro AND pl.pnr = s.pnru;

Die Verwendung der WHERE-Klausel wird im folgenden Abschnitt erklärt. Lesen Sie zunächst dort nach, und kehren Sie dann zu diesem Beispiel zurück.

3. Bei der Verwendung genesteter Subselects (auch logisch zwingend erforderlich)'.

Beispiel:

SELECT name FROM mitarb m
WHERE EXISTS
               (SELECT FROM mitpro
               WHERE mnr = m.mnr);

Im Beispiel wird der Tabelle MITARB ein (logisch notwendiger) weiterer Name zugeordnet, der in der Subselect-Konstruktion nach EXISTS verwendet wird. MNR im Subselect ist die Mitarbeiternummer in der Tabelle MITPRO (eine besondere Qualifizierung dieser Spalte mit MITPRO ist lt. Definition nicht erforderlich). M.MNR ist die Mitarbeiternummer in der Tabelle MITARB, angesprochen über den zugeordneten Namen M. In der WHERE-Klausel des Subselects werden die Mitarbeiternummern beider Tabellen (MITARB und MITPRO) auf Gleichheit verglichen.

Die WHERE-Klausel

Durch die WHERE-Klausel wird eine Untermenge Zeilen aus der Zwischenergebnismenge ausgewählt; es wird die relationale Operation Selektion (Restriktion) ausgeführt. Die Auswahl erfolgt auf der Basis von Spaltenwerten in Form einer Suchbedingung für diese Werte. Ist eine WHERE-Klausel nicht spezifiziert, werden alle Zeilen der Zwischenergebnismenge ausgewählt. In der WHERE-Klausel wird auch die relationale Operation Join realisiert. Wie wir sehen werden, können in einer WHERE-Klausel gleichzeitig Bedingungen für eine oder mehrere Selektionen und einen oder mehrere Joins formuliert werden.

Auch genestete Subselects sind komplizierte Formen von Abfragen, die Sie beim ersten Durchgehen des Stoffes übergehen können. Die richtige Spezifizierung genesteter Subselects ist vom Anfänger nicht zu erwarten. Sie sollten aber wissen, dass Sie in SQL viel kompliziertere Abfragen formulieren können, wozu oftmals Notwendigkeit besteht.
Alle Spaltenbezugnahmen in der Suchbedingung (search-condition) müssen eine Spalte der Zwischenergebnismenge eindeutig identifizieren. Wenn erforderlich, müssen die Spaltennamen durch die Tabellenbezugnahme und evtl. durch den Namen des Creators qualifiziert werden.

Beispiel:

Suche alle Zeilen, für die die ABTNR gleich RZ und das Gehalt kleiner oder gleich 2500 ist!

... WHERE abtnr = 'RZ' AND gehalt <= 2500 ...

Die WHERE-Klausel hat, wie einleitend oben gesagt, zwei Funktionen:

  1. Die der Formulierung der Bedingungen für die relationale Operation Selektion (Restriktion): In diesem Falle Wird im (expliziten) Prädikat auf einen äußeren Wert verglichen. - Und die der Formulierung von Join-Bedingungen: In diesem Falle wird im (impliziten) Prädikat auf innere Werte der Datenbasis verglichen, d. h., es erfolgt in der Regel der Vergleich von Werten einer Tabelle mit kompatiblen Werten einer anderen oder derselben Tabelle. Ausgesucht werden dann die erforderlichen Werte aus den zutreffenden Zeilen der einen Tabelle und die erforderlichen Werte aus den zutreffenden Zeilen der anderen Tabelle
  2. Spaltenbezugnahmen in einer Suchbedingung dürfen sich nicht auf gruppierte Spalten oder auf Spalten, die aus Set-Funktionen abgeleitet werden, beziehen. Wenn sich Selektionsbedingungen auf eine gruppierte Spalte beziehen, muss anstelle einer WHERE-Klausel eine HAVING-Klausel verwendet werden.
Die GROUP BY-Klausel und die HAVING-Klausel

Die GROUP BY-Klausel bestimmt die Gruppierung der Ergebnistabelle, um in der spezifizierten SELECT-Klausel Set-Funktionen anwenden zu können. Die HAVING-Klausel beschränkt die Zeilenauswahl in Gruppen in gleicher Weise wie die WHERE-Klausel in Tabellen oder Views. Beide Teiloperationen eines Subselects (Select-Statements) sind für den Anwender transparent, d. h. nicht zu sehen. Sie erzeugen rechnerintern die für die Gesamtbearbeitung erforderlichen Zwischenergebnisse. Überprüfen Sie auf jeden Fall die Operationen dieser Klauseln an selbst gewählten Beispielen! Die Operation des Gruppierens ist dem Lernenden wahrscheinlich aus konventionellen kaufmännischen Anwendungen (z. B. auf der Basis der Programmiersprachen PL/1 oder COBOL) bekannt.

Es handelt sich hier um eine Suchbedingung mit der Operation AND auf der Tabelle MITARB Die auszuwählenden Zeilen beziehen sich auf solche, deren Mitarbeiter in der Abteilung RZ arbeiten und die weniger oder gleich 2500 DM verdienen. - Warum steht RZ in Hochkommas 2500 jedoch nicht?
Wenn eine GROUP BY-Klausel spezifiziert ist, muss jede darin enthaltene Spaltenbezugnahme in der SELECT-Liste entweder eine gruppierte Spalte identifizieren, oder sie muss das Argument einer Set-Funktion sein. Die Zeilen der (nicht sichtbaren) Zwischenergebnismenge werden (logisch) in Gruppen angeordnet, in denen alle Werte in den zu gruppierenden Spalten identisch sind. Jede Gruppe wird im Endergebnis des Subselects auf eine einzelne Zeile reduziert.
Die Suchbedingung in der HAVING-Klausel definiert Beschränkungen auf den Werten der Elemente der SELECT-Liste in der SELECT-Klausel. Spaltenbezugnahmen in der Suchbedingung der HAVING-Klausel müssen eine gruppierte Spalte identifizieren, oder sie müssen in Set-Funktionen verwendet werden.
Meistens wird HAVING zusammen mit GROUP BY verwendet, wobei die Suchbedingungen sich entweder auf gruppierte Spalten oder auf die Ergebnisse von Set-Funktionen beziehen. Wird die HAVING-Klausel ohne GROUP BY-Klausel verwendet, werden alle Zeilen der Ergebnistabelle als eine einzige Gruppe betrachtet. In diesem Falle muss sich die HAVING-Klausel auf eine Set-Funktion beziehen.

Beispiele:

Beispiel 1

Für die Tabelle MITARB sind die Maximal-, Minimal- und Durchschnittsgehälter für alle Mitarbeiter zu bestimmen! Für die Ergebnistabelle sind die alternativen Namen Maximalgehalt, Minimalgehalt und Durchschnittsgehalt zu verwenden!

SELECT MAX(gehalt) Maximalgehalt; MIN(gehalt) Minimalgehalt, AVG (gehalt) Durchschnittsgehalt
FROM mitarb;

Ergebnis:
MAXIMALGEHALT MINIMALGEHALT DURCHSCHNITTSGEHALT
3500 1600 2441.7

Hätte man keine alternativen Namen spezifiziert, so würden die Spaltenbezeichnungen der Ergebnistabelle, abhängend vom konkret verwendeten DBMS, z. B. MAX( ), MIN( ), AVG( ) lauten.
Weil nicht gruppiert worden ist. besteht das Ergebnis aus einer einzigen Zeile (es wird auf eine Zeile reduziert) mit den geforderten Werten, die mit den hinter den Spaltennamen bzw. Ausdrücken stehenden neuen Namen ausgegeben werden. Natürlich hat die Alternativ-Namensvergabe im Statement in keiner Weise Verbindung zu den Spaltendefinitionen der Tabelle(n).

Beispiel 2

Zu bestimmen ist für jede Abteilung das Maximalgehalt, Minimalgehalt und Durchschnittsgehalt. Das Ergebnis ist nach ABTNR aufsteigend zu sortieren! Es sind alternative Namen zu verwenden!

SELECT abtnr Abteilungsnummer, MAX(gehalt) Maximalgehalt, MIN(gehalt) Minimalgehalt, AVG(gehalt) Durchschnittsgehalt FROM mitarb
GROUP BY abtnr ORDER BY abtnrq Ergebnis`:
abteilungsnummer maximalgehalt minimalgehalt durchschnitt
FE1 2750.50 2100.50 2333.67
FE2 2965.50 1600.00 2266.38
KON1 3010.50 1850.50 2337.00
KON2 3050.50 1950.00 2458.50
KON3 2870.00 2360.50 2601.83
RZ 3500.00 1875.00 2643.88
       
6 row(s) retrieved      

Das Ergebnis besteht aus so vielen Zeilen, wie es verschiedene Abteilungsnummern gibt - die Ergebnistabelle enthält für jede Gruppe eine Zeile mit den angegebenen, durch Set-Funktionen berechneten Werten. Die Spaltenüberschriften entsprechen den spezifizierten Zeichenketten nach den Spaltennamen bzw. Ausdrücken. Gegen die letzte Zeile - hier: 6 row(s) retrieved - haben Sie bitte keinen Einwand; dies ist im DBMS so implementiert, und dies sind meistens US-amerikanische Entwicklungen. Mit diesen englischen Begriffen müssen Sie sich noch Jahre abfinden. Im übrigen gewöhnt man sich schnell an die englisch-basierte Fachsprache der EDV.


6. Statemaents zur Metadaten-Definition history menue scroll up

Die Statements dieser Gruppe erzeugen die Objekte der Datenbasis. Hierzu gehört auch die Erzeugung der Datenbasis selbst. Die Metadaten beschreiben die Datenbasis in dem für die effektive Arbeit auf der Datenbasis erforderlichen Maße. Sie sind im Data Dictionary (DD) gespeichert. Entsprechend den allgemeinen Anforderungen bei der Arbeit mit Daten sind Statements zum Erzeugen, Verändern und Löschen notwendig.
Die Statements zum Definieren der Datenbasis sind: CREATE SCHEMA, CREATE DATABANK, CREATE IDENT, CREATE INDEX, CREATE SYNONYM, CREATE TABLE, CREATE VIEW, CREATE DOMAIN Statements zur Änderung der Datenbasis sind: ALTER DATABANK, ALTER IDENTS, ALTER TABLE.
Statements zum Löschen von Objekten sind die DROP-Statements entsprechend den CREATE-Statements. Weiterhin gibt es noch das nützliche COMMENT-Statement, das den Datenbankobjekten Informationen zuordnet.

Data Dictionary

Das Data Dictionary (DD) eines modernen DBMS ist eines seiner zentralen Steuereinrich-tungen. Das DD enthält alle Informationen über die Daten und seine Nutzer (Metadaten). In der Form des heute üblichen aktiven DD dient es nicht nur zur Information des Nutzers, sondern vielmehr der unmittelbaren Steuerung der Arbeit mit dem DBMS. Das DD besteht aus einer Anzahl vordefinierter (System-) Tabellen, d. h. es verwendet die Möglichkeiten das relationalen DBMS zur eigenen Steuerung.

Beispiel:

  1. Ein Nutzer meldet sich beim DBMS an. Er hat sein Ident (Nutzername und Password) einzugeben. Das System sucht in einer entsprechenden Tabelle nach Übereinstimmung. Ist die Prüfung positiv, ist der sich anmeldende Nutzer ein aktueller Nutzer.
  2. Der nunmehr grundsätzlich im DBMS zugelassene Nutzer möchte nun auf einer View Daten lesen. Das System prüft daraufhin in Systemtabellen des Data Dictionary, ob er Leseberechtigung (SELECT-Zugriffsrecht) für die angesprochene View hat. Ist das der Fall, werden aus den Basistabellen die entsprechenden Daten bereitgestellt, was wiederum über Systemtabellen gesteuert wird. Fordert der aktuelle Nutzer Daten aus Zeilen und/ oder Spalten von Tabellen an, die nicht zur View gehören, für die er SELECT-Zugriff hat, so wird die Abfrage nicht bearbeiten.

Bestrebungen zur Standardisierung von DD waren bisher wenig erfolgreich, bedingt hauptsächlich durch die Unterschiede in den Architekturen der DBMS und der zum Standard zusätzlich implementierten Funktionen und Statements. Die Tabellen des Data Dictionary sind bei den meisten DBMS normale Tabellen.
Die Systemtabellen des DD werden in der Regel nur durch Statements zur Definition von Metadaten (Beschreibung der Daten) und Statements zur Vergabe und Rücknahme von Privilegien beeinflusst. Unmittelbare Operationen zum Einfügen (INSERT), Ändern (UPDATE) bzw. Löschen (DELETE) stehen weder dem DBA (dem "Eigentümer" des gesamten DBMS) noch den Nutzern zur Verfügung. Die einzige Operation ist das Lesen (SELECT) auf Views auf den Systemtabellen. Auch dies ist wiederum beschränkt; z. B. kann ein Nutzer seine eigenen Tabellendefinitionen einsehen (er ist der Creator der Tabelle), in der Regel aber nicht diejenigen anderer Nutzer.
Insbesondere der oder die Nutzer, die DBA-Funktionen ausüben, müssen sich in den jeweiligen Handbüchern mit der jeweiligen Struktur des DD und seiner Systemtabellen vertraut machen.

Beispiel (Data Dictionary von MIMER):

Das DD von MIMER enthält 26 Systemtabellen, z. B. die folgenden (Tafeln 1 bis 4). (Analysieren Sie diese Tafeln nach ihren Inhalten und versuchen Sie, deren Inhalte in einem Trockentest zu nutzen!):

Tafel 1 COLUMN-View


COLUMNS-View enthält Spalten in zugreifbaren Tabellen
Spaltenname Datentyp Beschreibung
CREATOR CHAR(8) Erzeuger (Creator) der Tabelle
TABLE CHAR(18) Name der Tabelle oder View
COLUMN CHAR(18) Spaltenname
COLNO INT(3) Zeilennummer der Spalte in der Tabelle oder View
TYPE CHAR(1) Spaltentyp: 'C' - Character; 'D' - Decimal; 'F' - Float; 'I' - Integer
LENGTH INT(5) Länge der Spalte (Präzision)
SCALE INT(2) Anzahl Ziffern nach dem Dezimalpunkt; Null, wenn Type nicht Decimal
NULLABLE CHAR(1) NULL erlaubt oder nicht 'N' - NULL nicht erlaubt; 'Y' - NULL erlaubt
UPDATABLE CHAR(1) veränderbar oder nicht

Tafel 2 DOMAINS-View


DOMAIN-View beschreibt jeden Domain in der Datenbasis
Spaltenname Datentyp Beschreibung
CREATOR CHAR(8) Erzeuger des Wertebereichs (des Domains)
DOMAIN CHAR(18) Name des Domains
TYPE CHAR(1) Domaintyp: 'C' - Character; 'D' - Decimal; 'F' - Float; 'l' . Integer
LENGTH INT(5) Länge des Attributes des Domains
SCALE INT(2) Ziffern nach dem Dezimalpunkt; Null, wenn nicht decimal
DEFAULT CHAR(1) zeigt an, ob Standardwerte definiert sind 'Y' - Standardwert definiert - 'N' - Standardwerte nicht definiert
CHECK CHAR(1) zeigt an, ob Checkklausel definiert ist 'Y' - Checkklausel definiert 'N' - Checkklausel nicht definiert
Anmerkung: Zur Domaindefinition gehören weitere Systemtabellen

Tafel 3 Systemtabelle IDENT_PRIVS-View


IDENTS_PRIVS-View beschreibt alle Ident-Privilegien, die dem aktuellen Nutzer (GRANTEE = USER) verliehen worden sind oder die der aktuelle Nutzer verliehen hat (GRANTOR = USER)
Spaltenname Datentyp Beschreibung
GRANTEE CHAR(8) Name des Nutzers, dem das Privileg verliehen worden ist
GRANTOR CHAR(8) Name des Nutzers, der das Privileg verleiht
GRANTABLE CHAR(1) Privileg mit GRANT OPTION verliehen (Recht kann weitergegeben werden)
'Y' - GRANT OPTION erhalten
'N' - GRANT OPTION nicht erhalten

Tafel 4 Systemtabelle INDEXES-View


INDEXES-View enthält alle indizierten Spalten in Tabellen, für die der aktuelle Nutzer irgendein Zugriffsrecht hat.
Spaltenname Datentyp Beschreibung
CREATOR CHAR(8) Creator der Tabelle
INDEX CHAR(18) Name des Index
TABLE CHAR(18) Name der Tabelle, auf der der Index definiert ist
COLUMN CHAR(18) Name der Spalte, auf der der Index definiert ist
SEQNO INT(3) natürliche Zahl der Spalte im Index (für interne Steuerung verwendet)
 

CREATE-Statements

CREATE SCHEMA

Vom Standard wird ein Statement CREATE SCHEMA gefordert. Bei der Schemadefinition sind die Datenbank, ihr "Eigentümer" und die in ihr enthaltenen Tabellen und Views festzulegen. Dieses Statement wird z. Z. konsequent in keinem der bekannten DBMS realisiert. In INFORMIX gibt es jedoch ein Schema-Menü zur Erzeugung der Datenbank und der Tabel¬len. In anderen DBMS wird diese Funktion anders gelöst.
Der Standard schreibt folgende Funktionen und Syntax des Statements CREATE SCHEMA vor:

schema ::= CREATE SCHEMA AUTHORIZATION user [schema-element-list]
schema-element   base-table-definition
| viewdefinition
| grant-operation
base-table-definition   CREATE TABLE base-tabie (base-table-element-commalist)
base-table-element   column-definition
| table-constraint-definition
column-definition   column data-type
[NOT NULL]
[ DEFAULT (literal | USER | NULL) ]
table-constraint-definition   candidate-key-definition
| primary-key-definition
| foreign-key-definition
| check-condition
candidate-key-definition   UNIQUE (column-commalist)
primary-key-definition   siehe das Statement CREATE TABLE
foreign-key-definition   siehe das Statement CREATE TABLE
check-condition   CHECK (search-condition)
search-condition   siehe den Abschnitt über Suchbedingungen
view-definition   siehe das Statement CREATE VIEW
grant-operation   siehe die Statements zu GRANT

Man erkennt, dass ein Schema aus einer CREATE SCHEMA-Klausel, einer AUTHORIZATION-Klausel und beliebig vielen (auch Null) CREATE TABLE-Definitionen und/oder beliebig vielen View-Definitionen und /oder beliebig vielen Grant-Operationen besteht. Die AUTHORIZATION-Klausel identifiziert den Eigentümer jeder Basistabelle und/oder View, die in diesem Schema definiert ist.

CREATE IDENT

Erzeugt ein Nutzer-, Programm- oder Gruppenident; in ISQL und ESQL gleich verwendete. Syntax:

Beschreibung:

Ein neues Ident wird erzeugt. Ist das Ident ein Nutzer oder ein Programm, wird auch das Password vergeben. Beschränkungen: CREATE IDENT erfordert das Ident-Privileg für das vergebende Ident. Hinweise:

  • der Ident-Name muss eindeutig sein
  • wenn das erzeugte Ident eine Gruppe ist, wird dem Creator des Idents das MEMBER-Privileg WITH GRANT OPTION zugewiesen
  • ist das erzeugte Ident ein Programm, so erhält der Creator das EXECUTE-Privileg WITH GRANT OPTION
  • jeder erzeugte Nutzer oder jedes erzeugte Programm wird automatisch ein Mitglied der Gruppe PUBLIC
  • das Password muss in der Regel mindestens 4 und darf höchstens 8 Zeichen lang sein; es ist bei der Definition in Hochkommas einzuschließen

Beispiele:

CREATE IDENT fe_sub dba AS USER IDENTIFIED BY 'sub*dba@';

CREATE IDENT fe db AS GROUP;

CREATE DATABASE

Erzeugt eine neue Datenbank; wird in ISQL und ESQL mit gleicher Syntax verwendet. Teils in den DBMS auch als CREATE DATABANK verfügbar; evtl. syntaktisch anders gelöst - implementationsabhängig. Die Manuals der konkreten Systeme sind zu beachten!

Beschreibung:

Das Statement erzeugt eine neue Datenbank, die zur Aufnahme von Tabellen und Indextabellen vorbereitet ist; die Systemtabellen des Data Dictionary werden erzeugt. Das Statement in der obigen Syntax existiert z. B. in MIMER V5 und hat einen Teil der Funktionen des CREATE SCHEMA-Statements des SQL-Standards. Dieses Statement stellt u. a. die Verbindung mit dem Betriebssystem des Rechners her und ist deshalb an externe und weitere firmeneigene Bedingungen gebunden. Der Standard wird in der Regel nicht voll zugrunde gelegt.

integer Gibt die Anzahl Seiten an, die für die Datenbank vom Betriebssystem bereit gestellt werden sollen; rechnerabhängig.
filename Der Name des Files, unter dem die Datenbank vom Betriebssystem gespeichert wird.
LOG Alle Operationen auf der Datenbank werden unter Transaktionensteuerung vorgenommen, und alle Transaktionen werden protokolliert.
TRANS Alle Operationen auf der Datenbank werden unter Transaktionensteuerung vorgenommen. Transaktionen werden nicht protokolliert.
NULL Alle Operationen auf der Datenbank werden ohne Transaktionensteuerung vorgenommen; es wird nichts protokolliert.

Beschränkungen:

Das CREATE DATABANK-Statement erfordert DATABANK-Privileg,.

Hinweise:

  • der Datenbankname muss eindeutig sein
  • der Creator bekommt das Recht, auf dieser Datenbank Tabellen zu definieren und dieses Recht weiterzugeben (WITH GRANT OPTION) - hier ist das Recht gemeint, Datenbanken zu erzeugen - nicht jeder Nutzer der Datenbank wird dieses Recht haben
  • der Filename muss in Hochkommas (Apostrophe) eingeschlossen werden und den Konventionen des Betriebssystems des Rechners entsprechen. Weitere Angaben sind den Handbüchern zu den entsprechenden DBMS zu entnehmen

Beispiel:

CREATE DATABANK fedb OF 100 PAGES IN 'FEDB.DBF'
WITH NULL OPTION;

Zu lesen ist dieses Statement wie folgt: Erzeuge eine Datenbank FEDB mit 100 Seiten (rechnerabhängige Seitengröße beachten), gespeichert im File FEDB.DBF; es wird keine Transaktionensteuerung verwendet, und die Arbeit auf der Datenbank wird nicht protokolliert.

CREATE TABLE

CREATE TABLE erzeugt eine neue Tabelle; in ISQL und ESQL gleich verwendet. Evtl. sehen Sie sich zuerst das Beispiel am Ende dieses Abschnitts an. Syntax:

Beschreibung:

Es wird eine neue Tabelle in derjenigen Datenbank erzeugt, die in der IN-Klausel spezifiziert ist. Die Tabelle weist lediglich die definierte Struktur auf und ist solange leer, bis Daten eingegeben werden.
Spaltendefinitionen
Die Spalten werden in der Tabelle in der Reihenfolge angeordnet, wie sie in der Spaltenliste auftreten. Jede Spalte muss in der Tabelle einen eindeutigen Namen haben. Das Format einer jeden Spalte muss ein expliziter Datentyp sein. Das vom Standard geforderte DOMAIN ist in den DBMS unterschiedlich implementiert oder z. T. gar nicht vorhanden.
Wenn in der Formatdefinition die Schlüsselwörter NOT NULL folgen, akzeptieren diese Zeilen nicht den NULL-Indikator, d. h. die Spalte muss mit einem Wert belegt werden. Dies hat besondere Bedeutung für die Primärschlüsselspalten.

 



zur Hauptseite
© Samuel-von-Pufendorf-Gymnasium Flöha © Frank Rost am 30. März 2009

... dieser Text wurde nach den Regeln irgendeiner Rechtschreibreform verfasst - ich hab' irgendwann einmal beschlossen, an diesem Zirkus nicht mehr teilzunehmen ;-)

„Dieses Land braucht eine Steuerreform, dieses Land braucht eine Rentenreform - wir schreiben Schiffahrt mit drei „f“!“

Diddi Hallervorden, dt. Komiker und Kabarettist